2016-07-05 3 views
1

ZF3からスケルトンアプリをインストールしました。ルーティング設定で私はいくつかのルートを設定しました。これらのルートの一部は、レイアウトなしで応答を返す必要があります。 ZF2では、単に "setTerminal"と呼べるViewModelを使いました。しかし、現在、ViewModelはZendViewRendererのプライベートプロパティとしてネストされているため、Actionで直接使用できるわけではありません。どのようにして端末を設定できるのか分かりませんので、出力はレイアウトなしでレンダリングされます。ZF3:レイアウトのない端末/レンダービューを設定する(Zend-Expressive)

私は、キー 'terminal'、 'terminate'、 'may_terminate'を値trueで追加するなど、ルーティング設定でさまざまなオプションを試しました。また、別のFactoryを作成しようとしましたが、ViewModelに到達できないという同じ問題が発生しました。SetTerminalをtrueに設定したときに、別のViewModelをActionに作成してオブジェクトを2番目に渡すこともできませんでしたZendViewRendererオブジェクトの 'render'メソッドのパラメータで、同じオブジェクトの 'renderModal'を渡すと失敗します: "レンダリングできません、ターミナルとマークされた子が見つかりました" ..

私は見落としている簡単な設定が必要です私の質問はそうです。誰も私がターミナルでビューを設定する方法を知っていますか?

私は自分の問題をうまく説明してくれることを願っています。事前に多くの感謝。

+0

おそらく、ハウスキーピングタスクとして、この解決策を回答にしてから、自分の答えを受け入れます。 –

+1

完了@DavidWeinraub! – Nykac

答えて

2

私の解決策!

はい!私は "解決策"を見つけました。 ViewModalの端末設定にプッシュするのではなく、 "layout/terminal"という新しいレイアウトを実装しました。このレイアウトは変数$ contentのみを出力します。参照:https://github.com/zendframework/zend-expressive/issues/360

このレイアウトを使用するには、新しいファクトリを設定に追加する必要があります。

<?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; 
    } 
} 
関連する問題