ZF2中的链接依赖注入

时间:2013-05-29 11:09:50

标签: dependency-injection zend-framework2 chaining

我正在尝试在ZF2中创建一个简单的电子邮件模板测试,我正在使用Dependency注入来创建PhpRenderer类的实例,并设置了所有依赖项。

由于AggregateResolver中没有“电子邮件”路径,似乎我可能正在努力将注入链接起来。

在module.config.php中

'di' => array(
    'instance' => array(
        'Zend\View\Resolver\TemplatePathStack' => array(
            'options' => array(
                'script_paths'  => array(
                    'email' => __DIR__ . '/../view/application/email',
                ),
             ),
        ),
        'Zend\View\Resolver\AggregateResolver' => array(
            'attach' => array(
                'Zend\View\Resolver\TemplatePathStack',
            ),
        ),
        'Zend\View\Renderer\PhpRenderer' => array(
            'setResolver' => 'Zend\View\Resolver\AggregateResolver',
        ),
    ),
),

在TestController.php中

    $di = new \Zend\Di\Di;
    $renderer = $di->get('Zend\View\Renderer\PhpRenderer');
    $content = $renderer->render('email/test', null);

    echo($content);

消息:

    Zend\View\Renderer\PhpRenderer::render: Unable to render template "email/test"; resolver could not resolve to a file

感谢任何帮助。


由于编写了上述内容,我正在玩游戏并从di数组中删除了TemplatePathStack,这根本没有任何影响,所以我不确定AggregateResolver是否正在使用它,所以它可能是一个链接问题:

'di' => array(
    'instance' => array(
        /*'Zend\View\Resolver\TemplatePathStack' => array(
            'addPaths' => array(
                'paths'  => array(
                    'email' => __DIR__ . '/../view/application/email',
                ),
             ),
        ),*/
        'Zend\View\Resolver\AggregateResolver' => array(
            'attach' => array(
                'Zend\View\Resolver\TemplatePathStack',
            ),
        ),
        'Zend\View\Renderer\PhpRenderer' => array(
            'setResolver' => 'Zend\View\Resolver\AggregateResolver',
        ),
    ),
),

Aborgrove

1 个答案:

答案 0 :(得分:1)

最后,我通过将diar数组移出module.conf.php并在Module getServiceConf()方法中重新创建它来解决它。 (虽然我不确定这是放置它的最佳位置)

 public function getServiceConfig()
{
    return array(
        'factories' => array(
            // using the Session Manger to create one instance of the follwing models
            ......... more code here ............
            'EmailTemplatePathStack' => function($sm) {
                $template_path_stack =  new \Zend\View\Resolver\TemplatePathStack();
                $paths  = array('emailfolder' => __DIR__ . '/view/application/email');
                $template_path_stack->addPaths($paths);
                return $template_path_stack;

            },
            'EmailAggregateResolver' => function($sm) {
                $resolver =  new \Zend\View\Resolver\AggregateResolver();
                $resolver->attach($sm->get('EmailTemplatePathStack'));
                var_dump($resolver);
                return $resolver;

            },
            'EmailPhpRenderer' => function($sm) {
                $php_renderer =  new \Zend\View\Renderer\PhpRenderer();
                $php_renderer->setResolver($sm->get('EmailAggregateResolver'));
                return $php_renderer;
            },
        ),
    );
}

然后将控制器更改为:

    $sm = \Application\Model\ServiceLocatorFactory::getInstance();
    $renderer = $sm->get('EmailPhpRenderer');
    $content = $renderer->render('test.phtml', null);

    echo($content);