2016-07-05 74 views
1

我已經從ZF3'zend-expressive'安裝了skelleton應用程序。在路由配置中,我配置了幾條路由。這些路線中的一些應該返回沒有佈局的響應。在ZF2中,我簡單地使用了可以稱之爲「setTerminal」的ViewModel。但是現在ViewModel並不直接在Action中可用,因爲它嵌套爲ZendViewRenderer的私有屬性。我無法弄清楚如何設置終端,因此輸出呈現不帶佈局。ZF3:設置沒有佈局的終端/渲染視圖(Zend-Expressive)

我已經嘗試了路由配置中的各種選項,例如添加鍵'terminal','terminate'和'may_terminate'的值爲true。也試圖做出一個單獨的工廠,但最終有同樣的問題,我無法到達ViewModel ..它也沒有工作,在行動中,當我setTerminal真正的,並通過對象作爲第二個單獨的ViewModel在ZendViewRenderer對象的「渲染」的方法參數,它同一個對象的傳遞時,「renderModal」失敗:「無法呈現;遇到子標記終端」 ..

必須有,我可以俯瞰簡單的配置,所以我的問題是。有誰知道我如何設置終端的觀點?

希望我能很好地解釋我的問題。提前謝謝了。

+0

也許,作爲一項家務任務,將此解決方案轉化爲答案,然後接受您自己的答案。 –

+1

完成@DavidWeinraub! – Nykac

回答

2

我的解決方案!

是的!我找到了一個「解決方案」。我沒有推入ViewModal的終端設置,而是實現了一種名爲「佈局/終端」的新佈局。該佈局僅輸出變量$ content。參考:https://github.com/zendframework/zend-expressive/issues/360

要使用此佈局,您應該在配置中添加一個新的Factory。

<?php 
namespace Factory; 

use Interop\Container\ContainerInterface; 
use Zend\Expressive\Template\TemplateRendererInterface; 
use Zend\ServiceManager\Factory\FactoryInterface; 
use Zend\View\Model\ViewModel; 

class RenderWithoutTemplate implements FactoryInterface 
{ 
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null) 
    { 
     $template = $container->has(TemplateRendererInterface::class) 
      ? $container->get(TemplateRendererInterface::class) 
      : null; 

     $r = new \ReflectionClass($template); 
     $view = new ViewModel(); 
     $view->setTerminal(true); // Does not affect any render behaviour (?) 
     $view->setTemplate('layout/terminal'); 

     $prop = $r->getProperty('layout'); 
     $prop->setAccessible(true); 
     $prop->setValue($template, $view); 

     return $template; 
    } 
}