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


Can not get ViewRenderer instance from ServiceLocator in Console Request

我试图创建一个通过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 
    ) );

一切都运行时,我从web浏览器运行。但是当我从控制台运行时,我得到了错误。谢谢。

你需要添加一个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));

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

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