Не удается получить экземпляр ViewRenderer из ServiceLocator в запросе консоли
Я пытаюсь создать функцию для отправки электронной почты через 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 answers
Вам нужно будет добавить средство визуализации php в действие консоли, так как вы не отображаете содержимое html, но используете интерфейс командной строки, который по умолчанию не может этого сделать.
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
Это потому, что я устанавливал в качестве шаблона файл .phtml внутри файла module/mymodulename/view/email, и 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));