无法从控制台请求中的ServiceLocator获取ViewRenderer实例

时间:2014-05-28 08:28:36

标签: php zend-framework2 sendmail

我尝试创建一个通过consoleRequest发送电子邮件的功能。由crontab设置。我收到了这个错误

Zend\ServiceManager\Exception\ServiceNotFoundException: 
Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for ViewRenderer

当我从控制台运行时。

$renderer = $this->getServiceLocator()->get('ViewRenderer');
$content = $renderer->render ( 'admin/email/tmpl/jobinfo', array (
            "jobs" => $recruitingData 
    ) );

当我从网络浏览器运行时,每件事都会运行。但是当我从控制台运行时,我收到了错误。 感谢。

2 个答案:

答案 0 :(得分:2)

您需要在控制台操作中添加一个php渲染器,因为您没有显示html内容,而是使用默认情况下无法执行此操作的cli。

use Zend\View\Model\ViewModel;
use Zend\View\Renderer\PhpRenderer;
....

$renderer = new PhpRenderer();

现在添加您要渲染的视图。

$template = 'path/to/template/';
$model = new ViewModel();
$model->setTemplate($template);

最后只需存储渲染器的结果并将其传递给您的邮件功能/服务/无论如何。

$yourMailService->whateverMethodYouUseToSetContent($renderer->render($model));

答案 1 :(得分:0)

在我的情况下,我试图通过控制台发送电子邮件并收到以下错误:

======================================================================
The application has thrown an exception!
======================================================================
Zend\View\Exception\RuntimeException
Zend\View\Renderer\PhpRenderer::render: Unable to render template "email/welcome.phtml"; resolver could not resolve to a file

这是因为我在 module / MyModuleName / view / email 中将 .phtml 文件设置为模板,并且PhpRenderer不知道此路径。

要解决此错误,需要注册一个新的解析器并设置它的路径。

use Zend\View\Resolver\TemplatePathStack;

...

// defining the resolver
$resolver = new TemplatePathStack();
$resolver->addPath('full/path/to/view/in/module');

// create a PhpRenderer
$renderer = new PhpRenderer();

// Set the resolver to renderer
$renderer->setResolver($resolver);

// create the ViewModel
$model = new ViewModel();

// And set the template to use
$model->setTemplate('some-template.phtml');

// Finally use it (get example from cptnk in previous answer)
$yourMailService->whateverMethodYouUseToSetContent($renderer->render($model));