Zend framework2 zf2视图策略,ViewEvent渲染器始终为空

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,但仍然得到相同的结果

我试图在ZF2中实现视图策略

就基本设置而言,除了ViewEvent渲染器始终为空之外,其他一切似乎都正常工作,因此渲染器永远不会被注入到策略中,TemplateResolver仍然请求模板并显示以下错误

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;
}