【问题标题】:ZF2 console error - Get was unable to fetch or create an instance for ViewRendererZF2 控制台错误 - Get 无法获取或创建 ViewRenderer 的实例
【发布时间】:2014-11-08 11:18:04
【问题描述】:

我有教义控制台的问题。我有一个包含此代码的 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/corradini.com/www/vendor/zendframework/zendframework/library/Zend/ServiceManager/ServiceManager.php:529

为什么会出现这个错误?

【问题讨论】:

    标签: php doctrine-orm zend-framework2 command-line-interface


    【解决方案1】:

    您不能在控制台请求中直接从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
       }
    

    希望对你有帮助。

    【讨论】:

      【解决方案2】:

      感谢 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
      

      哪里出错了?

      谢谢

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          【解决方案4】:

          在 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');
          

          【讨论】:

            猜你喜欢
            • 2012-12-02
            • 1970-01-01
            • 2013-03-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-01-14
            • 2023-03-20
            • 1970-01-01
            相关资源
            最近更新 更多