2014-11-08 55 views
0

我有教条控制台的问题。我有一个包含此代码MailServiceFactory.php:ZF2控制台错误 - Get无法为ViewRenderer获取或创建实例

namespace Application\Service; 

use Zend\ServiceManager\FactoryInterface; 
use Zend\ServiceManager\ServiceLocatorInterface; 

class MailServiceFactory implements FactoryInterface 
{ 
    public function createService(ServiceLocatorInterface $serviceLocator) 
    { 
     $I_render = $serviceLocator->get('ViewRenderer'); 

     $a_config = $serviceLocator->get('config'); 

     return new MailService($I_render, $a_config); 
    } 
} 
use Zend\ServiceManager\FactoryInterface; 
use Zend\ServiceManager\ServiceLocatorInterface; 

class MailServiceFactory implements FactoryInterface 
{ 
    public function createService(ServiceLocatorInterface $serviceLocator) 
    { 
     $I_render = $serviceLocator->get('ViewRenderer'); 

     $a_config = $serviceLocator->get('config'); 

     return new MailService($I_render, $a_config); 
    } 
} 

和所有功能的作品,但是当我执行vendor/bin/doctirne-module我得到的错误如下:

Fatal error: Uncaught exception 'Zend\ServiceManager\Exception\ServiceNotFoundException' with message 'Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for ViewRenderer' in /Users/Daniele/Apps/corradini.com/www/vendor/zendframework/zendframework/library/Zend/ServiceManager/ServiceManager.php:529

为什么我得到这个错误?

回答

0

您不能在控制台请求上从ServiceLocator直接获得ViewRenderer,因为它不在舞台上,因为请求不是HttpRequest

而不是ViewRenderer,您可以轻松地尝试将PhpRenderer实例传递到您的服务并使用该实例呈现ViewModel。例如:

use Zend\View\Renderer\PhpRenderer; 

class MailServiceFactory implements FactoryInterface 
{ 
    public function createService(ServiceLocatorInterface $serviceLocator) 
    { 
     $renderer = new PhpRenderer(); 
     $a_config = $serviceLocator->get('config'); 

     return new MailService($renderer, $a_config); 
    } 

现在,在您的MailService的:

use Zend\View\Renderer\RendererInterface; 
use Zend\View\Model\ViewModel; 

class MailService 
{ 
    protected $renderer; 

    public function __construct(RendererInterface $renderer, $config) 
    { 
     $this->renderer = $renderer; 
     // set your config etc.. 
    } 

    public function fooMethod() 
    { 
     $model = new ViewModel(); 
     $model->setTemplate('path/to/template.phtml'); 
     $result = $this->renderer->render($model); 
     // The $result contains rendered html markup 
    } 

希望它能帮助。

0

感谢foozy现在的教义控制台funciton!但我无法读取渲染邮件的tempalte。

My tempate is locatend in module/Application/view/email/template.phtml 

在我module.config.php有配置:

'template_path_stack' => array(
      'application' => __DIR__ . '/../view', 
     ), 

和错误:

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

哪里错了吗?

感谢

0

我有同样的问题后,我加入了view_manager配置控制台配置。解决的办法是刚刚从ViewManager拉渲染:

$renderer = $serviceLocator->get('ViewManager')->getRenderer(); 

这也将注册ViewRenderer服务,所以以后这get('ViewRenderer')任何调用应该工作了。

相关问题