ZF2控制台错误-Get无法获取或创建ViewRenderer的实例


ZF2 console error - Get was unable to fetch or create an instance for ViewRenderer

我有条令控制台的问题。我有一个MailServiceFactory.php,其中包含以下代码:

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时,我会得到以下错误:

致命错误:未捕获异常带有消息的"Zend''ServiceManager''Exception''ServiceNotFoundException"'Zend''ServiceManager''ServiceManager::get无法获取或创建中ViewRenderer的实例/Users/Daniele/Apps/coradini.com/www/vendor/zendframework/zendfframework/library/Zend/ServiceManager/ServiceManager.php:529

为什么我会出现这个错误?

您不能在控制台请求上直接从ServiceLocator获取ViewRenderer,因为它不在阶段中,因为请求不是HttpRequest

您可以很容易地尝试将PhpRenderer实例传递给您的服务,并使用它来呈现ViewModel,而不是ViewRenderer。例如:

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

现在在您的邮件服务:

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
   }

希望能有所帮助。

感谢foozy now条令控制台功能!但我无法阅读渲染邮件的临时模板。

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

哪里错了?

感谢

在控制台配置中添加了view_manager配置后,我也遇到了同样的问题。解决方案是从ViewManager:中提取渲染器

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

这也将注册ViewRenderer服务,因此在此之后对get('ViewRenderer')的任何调用都应该可以工作。

在ZF3中,TemplateMapResolver也可以帮助您解决一些问题,如:"PhpRenderer::render:无法渲染模板"

$resolver = new 'Zend'View'Resolver'TemplateMapResolver();
$resolver->setMap([
    'mailTemplate' => __DIR__ . '/../../view/email/testmail.phtml'
]);
$renderer->setResolver($resolver);
$viewContent = new 'Zend'View'Model'ViewModel($contentArray);
$viewContent->setTemplate('mailTemplate');