Zend framework2 zf2视图策略,ViewEvent渲染器始终为空
我试图在ZF2中实现视图策略 就基本设置而言,除了ViewEvent渲染器始终为空之外,其他一切似乎都正常工作,因此渲染器永远不会被注入到策略中,TemplateResolver仍然请求模板并显示以下错误Zend framework2 zf2视图策略,ViewEvent渲染器始终为空,zend-framework2,Zend Framework2,我试图在ZF2中实现视图策略 就基本设置而言,除了ViewEvent渲染器始终为空之外,其他一切似乎都正常工作,因此渲染器永远不会被注入到策略中,TemplateResolver仍然请求模板并显示以下错误 PhpRenderer::render: Unable to render template "api/api/get"; resolver could not resolve to a file' 我甚至尝试从ZF2复制代码JsonModel和JsonStrategy,但仍然得到相同的结果
PhpRenderer::render: Unable to render template "api/api/get"; resolver could not resolve to a file'
我甚至尝试从ZF2复制代码JsonModel和JsonStrategy,但仍然得到相同的结果。
ViewYamlStrategy.php
module.php
module.config.php
控制器
ViewYamlStrategy.php
ViewYamlRenderer.php
YamlModel.php
谢谢我认为这是因为策略/听众被触发的顺序;一旦找到ViewRender,事件传播将停止并返回该渲染器
标准PhpRenderStrategy的默认事件优先级似乎为1,而其他JsonStrategy etc在此之前的事件优先级似乎为100
尝试更改$priority;也许101
我终于找到了问题所在 ViewYamlStrategy.php
谢谢,但不幸的是,这似乎不起作用。我认为整个问题是将YamlRenderer注入到视图事件中,因为它总是空的。
public function selectRenderer(ViewEvent $e)
{
$renderer = $e->getRenderer(); // Always return null
}
public function getServiceConfig()
{
return ['factories' => [
'ViewYamlRenderer' => "Namespace\Mvc\Service\ViewYamlRendererFactory",
'ViewYamlStrategy' => "Namespace\Mvc\Service\ViewYamlStrategyFactory",
],
];
}
'view_manager' => [
'strategies' => [
'ViewYamlStrategy'
],
],
public function getList()
{
return new YamlModel($data);
}
function __construct(ViewYamlRenderer $renderer)
{
$this->renderer = $renderer;
}
public function attach(EventManagerInterface $events, $priority = 1)
{
$this->listeners[] = $events->attach(ViewEvent::EVENT_RENDERER, [$this, "selectRenderer"], $priority);
$this->listeners[] = $events->attach(ViewEvent::EVENT_RESPONSE, [$this, "injectResponse"], $priority);
}
public function selectRenderer(ViewEvent $e)
{
$renderer = $e->getRenderer();
if ($this->renderer !== $renderer) {
return;
}
}
public function injectResponse(ViewEvent $e)
{
$renderer = $e->getRenderer(); // Always null
if ($this->renderer !== $renderer) {
return;
}
$result = $e->getResult();
$response = $e->getResponse();
$response->setContent($result);
}
public function render($nameOrModel, $values = null)
{
return $nameOrModel->serialize();
}
public function setResolver(\Zend\View\Resolver\ResolverInterface $resolver)
{
$this->resolver = $resolver;
}
protected $captureTo = null;
protected $terminate = true;
public function serialize()
{
/*Serialize Object and return a string*/
}
$this->listeners[] = $events->attach(
ViewEvent::EVENT_RENDERER,
[$this, "selectRenderer"],
101 // <-- change here
);
/* This should return a renderer */
public function selectRenderer(ViewEvent $e)
{
// here I was checking the Renderer which was not created yet
// and instead I should've checked the model
$model = $e->getModel();
if (!$model instanceof YamlModel) {
return;
}
return $this->renderer;
}