2013-05-29 130 views
0

我想在ZF2中创建一个简单的电子邮件模板测试,我使用依赖注入为了创建一个PhpRenderer类的实例,并设置了所有依赖关系。ZF2链接依赖注入

看来,我可能会拼命注入链接,因为路径“电子邮件”不存在于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 

任何帮助将受到欢迎。


自写上面,我打得周围,由对苯二甲酸二数组中删除的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

+0

乍一看,该'TemplatePathStack'期待'script_paths的关键参数'包含模板路径的数组,但你使用'setPaths' – Crisp

+0

谢谢克里斯,我已经编辑了相应的,也在上面的问题。应该将'options'数组自动传递到TemplatePathStack的__construct方法中?因为我正在为__construct中的'options'数组获取NULL值。 – Aborgrove

回答

1

在我由二阵列移出module.conf.php的和在模块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);