У меня проблема с доктриной консоли. У меня есть 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
Почему я получаю эту ошибку?
Вы не можете получить ViewRenderer
прямо из ServiceLocator
на консольных запросах, потому что это не в стадии, так как запрос не является 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
}
Надеюсь, поможет.
Спасибо Foozy теперь учение консоли Funciton! но я не могу прочитать шаблон для рендеринга почты.
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');