2016-07-05 3 views
1

Я установил приложение skelleton из ZF3 'zend-expressive'. В конфигурации маршрутизации я настроил несколько маршрутов. Некоторые из этих маршрутов должны возвращать ответ без макета. В ZF2 я просто использовал ViewModel, на котором вы могли бы назвать «setTerminal». Но теперь ViewModel недоступен в Action, поскольку он вложен в качестве частного свойства ZendViewRenderer. Я не могу понять, как я могу установить терминал, поэтому вывод выводится без макета.ZF3: установить терминал/визуализировать вид без макета (Zend-Expressive)

Я пробовал различные параметры в конфигурации маршрутизации, такие как добавление терминалов ключей ',' terminate 'и' may_terminate 'со значением true. Также попытались сделать отдельный Factory, но в итоге с той же проблемой, что я не могу достичь ViewModel .. Это также не сработало, чтобы создать отдельную ViewModel в Action, когда я установил Terminal на true и передал объект как 2-й параметр в методе «рендеринга» объекта ZendViewRenderer, он терпит неудачу при передаче «renderModal» одного и того же объекта: «Невозможно выполнить визуализацию, дочерний отмеченный терминал».

Должна быть простая конфигурация, которую я пропускаю , поэтому мой вопрос. Кто-нибудь знает, как я могу установить вид на терминал?

Надеюсь, что я хорошо объяснил свою проблему. Спасибо заранее.

+0

Возможно, как домашнее задание, сделайте это решение ответом, а затем примите свой ответ. –

+1

Done @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; 
    } 
} 
Смежные вопросы