Symfony 2.8 注入 Twig

4

前置说明:我之前使用Drupal 7,现在正在学习Symfony。

我创建了一个自定义模型(不过我看到Symfony称这些为“服务”),希望通过twig将其呈现为数组并存储到变量中。

我发现这个链接,认为这种注入方法可以解决问题:http://symfony.com/doc/2.8/service_container.html

可惜的是,我遇到了以下错误:

类型错误:必须传递给AppBundle\Model\Newsletter::__construct() 的第1个参数必须是AppBundle\Model\Twig_Environment的实例,未提供任何内容,位于/home/dan/working_files/symfony-playground/src/AppBundle/Controller/DefaultController.php的第130行被调用

那么,我想知道什么是可接受的方法,以便在自定义的模型/服务/类中使用twig?

如果有用的话,下面是一些我的参考代码:

services.yml

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

src/AppBundle/Model/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
抱歉,我不确定你的意思。目前正在从DefaultController.php调用行$newsletter = new Newsletter(); - retrodans
所以控制器有帮助程序来获取服务。简单调用 $this->get('service_name'); 将为您提供带注入依赖项的服务。如果您使用 new ClassName() 调用类,则必须手动将 Twig 实例传递给类构造函数。 - ArtOsi
太棒了,这个和Alessandro的评论一起帮助解决了这个问题,感谢你的帮助。 - retrodans
2个回答

2

尝试使用EngineInterface替换twig,如下所示:

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;
    }
}

在需要调用服务之后:

$this->get('service_name');

更改这个似乎不能解决问题。很遗憾。 - retrodans
所以有两个问题。一个是切换到 EngineInterface,另一个是更改如何调用我的 Model,所以我使用 $this->get('service_name'); - retrodans
非常高兴能够帮助到您! :) - Alessandro Minoccheri
我更新了答案,加上了服务中缺失的部分。 - Alessandro Minoccheri

0
当你调用$newsletter = new Newsletter();时,你没有通过依赖注入容器访问该服务,忽略了你所定义的服务。
为了利用 DIC 并使像 @twig 这样的依赖项注入到您的服务中,应使用服务容器获取服务实例。在Symfony控制器中,您可以这样做:
$newsletter = $this->get('appbundle.newsletter');

@twig 会按照 yaml 文件中的定义被注入到您的服务中,并且通过容器在每个使用服务的地方共享。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接