Symfony自动装配接口到真实服务

时间:2017-09-08 07:11:07

标签: symfony dependency-injection autowired

我需要为Symfony 2.8应用程序配置自动装配。

服务依赖于Symfony\Component\Templating\EngineInterface

use Symfony\Component\Templating\EngineInterface;
class MyService
{
    /** @var EngineInterface */
    private $templating;

    public function __construct(EngineInterface $templating)
    {
        $this->templating = $templating;
    }
}

但是我明显得到一个错误,因为这个接口是在三个不同的类中实现的。

  

无法自动装入类型的参数   服务的“Symfony \ Component \ Templating \ EngineInterface”   “为MyService”。多   存在的服务是接口(templating.engine.delegating,   templating.engine.php,templating.engine.twig)。

我想在每次需要templating.engine.delegating时注入EngineInterface,因此我向service.yml

添加了一个定义
services:
  template:
    autowiring_type: 'Symfony\Component\Templating\EngineInterface'
    alias: 'templating.engine.delegating'

但我仍然得到同样的错误 - 应用程序无法找到用于EngineInterface

的服务

所以问题是可以将接口连接到已定义的内核服务吗?

当必须将抽象类连接到服务时,我设法处理类似的问题。

服务:

use Doctrine\Common\Cache\CacheProvider;
class MyOtherService
{
    /** @var CacheProvider */
    private $cache;

    public function __construct(CacheProvider $cache)
    {
        $this->cache = $cache;
    }
}
services:
  memcache_cache:
    class: 'Doctrine\Common\Cache\MemcacheCache'
    autowiring_types: 'Doctrine\Common\Cache\CacheProvider'
    calls:
    - [ setMemcache, ["@memcache"] ]
    - [ setNamespace, ["%memcache.prefix%"] ]

所以,我已经创建了一个服务(memcache_cache)并为它定义了一个autowiring_types。每次注入抽象CacheProvider时都应使用memcache_cache

但这很容易,因为这不是内核服务。我已在services.yml中自行定义,而我无法通过添加templating.engine.delegating

的方式扩展autowiring_types: 'Symfony\Component\Templating\EngineInterface'服务

0 个答案:

没有答案