我正在开发一个需要在流程完成后发送电子邮件的应用程序。由于电子邮件需要是 HTML,我有一个聪明的想法,就是将视图呈现为电子邮件正文,这样我就可以实现“单击此处在浏览器上查看”功能。这一切都在实现 AbstractRestfulController 的控制器内部进行,因此视图本身驻留在我的前端模块中,以便可以通过浏览器从 URL 访问它。但是我得到了一个
未提供 RouteStackInterface 实例
当我尝试渲染视图时出错。
这是我的代码:
use Zend\View\HelperPluginManager;
use Zend\View\Resolver;
use Zend\View\Renderer\PhpRenderer;
//Instantiate the renderer
$renderer = new PhpRenderer();
$resolver = new Resolver\TemplateMapResolver(array(
'layout' => realpath(__DIR__ . '/../../../../Application/view/layout/email.layout.phtml'),
'email/view' => realpath(__DIR__ . '/../../../../Application/view/application/email/view.phtml')
)
);
$renderer->setResolver($resolver);
$renderer->url()->setRouter($this->getEvent()->getRouter());
我在 API 文档中看到,您可以通过给它一个 RouteStackInterface 来将路由器设置为 URL 插件,因此是最后一行。但是,这似乎也不起作用。
我想使用相同的视图发送一封 HTML 电子邮件,其中包含邮件正文中的链接并通过 URL 显示在浏览器上。
关于如何做到这一点的任何想法/建议?
编辑/解决方案:
根据下面dotwired的回答,从服务管理器获取渲染器实例会导致插件被正确实例化。所以这是有效的代码:
模块.config.php:
array('view_manager' => array(
'template_map' => array(
'layout/email' => __DIR__ . '/../../Application/view/layout/email.layout.phtml',
'email/share' => __DIR__ . '/../../Application/view/application/email/share.phtml',
'email/view' => __DIR__ . '/../../Application/view/application/email/view.phtml',
),
),
);
休息控制器:
use Zend\View\Model\ViewModel;
//get the renderer
$renderer = $this->getServiceLocator()->get('Zend\View\Renderer\RendererInterface');
//Create the views
$shareView = new ViewModel(array('data' => $data));
$shareView->setTemplate('email/view');
$emailLayout = new ViewModel(array('subject' => $this->_subject, 'content' => $renderer->render($shareView)));
$emailLayout->setTemplate('layout/email');
//Render the message
$markup = $renderer->render($emailLayout);
使用服务管理器中的渲染器,$this->url() 视图助手可以正常工作。