2017-05-31 165 views
2

预注:我从一个Drupal 7背景学习Symfony的。Symfony的2.8注射枝杈

我创建了一个自定义模式(虽然我觉得他们被称为从我读Symfony的服务),并希望它使通过树枝的数组变量。

我发现这个链接,并认为这种注射方法会做的伎俩: http://symfony.com/doc/2.8/service_container.html

可悲的是,我并了以下错误:

Type error: Argument 1 passed to AppBundle\Model\Newsletter::__construct() must be an instance of AppBundle\Model\Twig_Environment, none given, called in /home/dan/working_files/symfony-playground/src/AppBundle/Controller/DefaultController.php on line 130

所以,我想知道是什么一个可接受的方法,所以我可以在我的自定义模型/服务/类中使用树枝?

如果是用的,这里是我的一些代码,以供参考:

services.yml

services: 
    appbundle.newsletter: 
     class: AppBundle\Model\Newsletter 
     arguments: ['@twig'] 

的src /的appbundle /型号/ Newsletter.php

namespace AppBundle\Model; 

class Newsletter 
{ 
    private $twig; 
    public function __construct(Twig_Environment $twig) 
    { 
     $this->twig = $twig; 
    } 
} 

呼唤我的模型

$newsletter = new Newsletter(); 
+1

你应该把你的模型称为服务来注入依赖关系,如果你在控制器中调用它,你可以得到这样的服务:'$ newsletter = $ this-> get('appbundle.newsletter');' – ArtOsi

+0

对不起,我不是确定你的意思。 ''newsletter = new Newsletter();'目前正在从'DefaultController.php'调用。 – retrodans

+0

所以控制器有助手来获得服务。简单地调用'$ this-> get('service_name');'将为注入的依赖注入服务。如果你用'new ClassName()'调用类,那么你必须手动将树枝实例传递给类的构造函数。 – ArtOsi

回答

0

尝试改变树枝EngineInterface这样的:

services: 
    appbundle.newsletter: 
     class: AppBundle\Model\Newsletter 
     arguments: ['@templating'] 

而且

namespace AppBundle\Model; 

use Symfony\Bundle\FrameworkBundle\Templating\EngineInterface; 

class Newsletter 
{ 
    private $twig; 
    public function __construct(EngineInterface $templating) 
    { 
     $this->twig = $templating; 
    } 
} 

后,您需要O调用服务:

$this->get('service_name'); 
+0

改变这个似乎并不能解决问题 – retrodans

+0

所以有2个问题。一个是切换到EngineInterface,另一个是改变我如何调用我的模型,所以我使用'$ this-> get('service_name');' – retrodans

+0

非常高兴帮助你! :) –

0

当你调用$newsletter = new Newsletter();你没有访问s通过依赖注入容器来服务,忽略了你所做的服务定义。

要利用DIC,有你喜欢的依赖注入@twig你的服务,你应该使用服务容器抢的服务实例。要做到这一点一个Symfony的控制器上,你可以做这样的:

$newsletter = $this->get('appbundle.newsletter'); 

@twig是要在服务中注入对YAML文件的定义,它是每一个地方之间共享您再次通过容器使用您的服务。