2016-07-05 32 views
1

Ich habe die skelleton App von ZF3 'zend-expressive' installiert. In der Routing-Konfiguration habe ich ein paar Routen konfiguriert. Einige dieser Routen sollten eine Antwort ohne das Layout zurückgeben. In ZF2 habe ich einfach das ViewModel benutzt, auf dem man "setTerminal" nennen könnte. Aber jetzt ist das ViewModel nicht direkt in der Aktion verfügbar, da es als private Eigenschaft des ZendViewRenderer verschachtelt ist. Ich kann nicht herausfinden, wie ich das Terminal einstellen kann, so dass die Ausgabe ohne Layout gerendert wird.ZF3: Terminal/Renderansicht ohne Layout einstellen (Zend-Expressive)

Ich habe verschiedene Optionen in der Routing-Konfiguration ausprobiert, z. B. das Hinzufügen der Schlüssel 'terminal', 'terminate' und 'may_terminate' mit dem Wert true. Habe auch versucht, eine separate Factory zu machen, aber endete mit dem gleichen Problem, dass ich das ViewModel nicht erreichen kann. Es hat auch nicht funktioniert, um ein separates ViewModel in der Action zu erstellen, wenn ichTerminal auf true setze und das Objekt als 2nd überlasse Parameter in der 'render' -Methode des ZendViewRenderer-Objekts, scheitert beim Übergeben von 'renderModal' des gleichen Objekts: "Darf nicht gerendert werden; angetroffenes untergeordnetes Terminal"

Es muss eine einfache Konfiguration geben, die ich übersehen habe Also meine Frage ist. Weiß jemand, wie ich die Sicht auf Terminal einstellen kann?

Ich hoffe, dass ich mein Problem gut erklärt habe. Vielen Dank im Voraus.

+0

Vielleicht, als eine Hausaufgabe, machen Sie diese Lösung in eine Antwort und dann akzeptieren Sie Ihre eigene Antwort. –

+1

Fertig @DavidWeinraub! – Nykac

Antwort

2

Meine Lösung!

Ja! Ich habe eine "Lösung" gefunden. Anstatt in die Terminaleinstellungen von ViewModal zu wechseln, habe ich ein neues Layout namens "layout/terminal" implementiert. Dieses Layout gibt nur die Variable $ content aus. Referenz: https://github.com/zendframework/zend-expressive/issues/360

Um dieses Layout zu verwenden, sollten Sie ein neues Factory in die Konfiguration hinzufügen.

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