2015-02-15 10 views
5

Jak mogę odsłuchać zdarzenie wysyłki określonego kontrolera? W tej chwili należy wykonać następujące czynności:ZF2 sposób odsłuchania zdarzenia wysyłki określonego kontrolera

Module.php

public function onBootstrap(EventInterface $event) { 
    $application = $event->getApplication(); 
    $eventManager = $application->getEventManager(); 
    $serviceManager = $application->getServiceManager(); 

    $eventManager->attach($serviceManager->get('MyListener')); 
} 

MyListener.php

class MyListener extends AbstractListenerAggregate { 

    public function attach(EventManagerInterface $eventManager) { 
     $this->listeners[] = $eventManager->attach(
      MvcEvent::EVENT_DISPATCH, function($event) { 
       $this->setLayout($event); 
      }, 100 
     ); 
    } 

    public function setLayout(EventInterface $event) { 
     $event->getViewModel()->setTemplate('mylayout'); 
    } 
} 

Ustawia układ dla wszystkich wysyłek kontrolera. Teraz chcę ustawić układ tylko wtedy, gdy aplikacja wywoła określony kontroler.

Odpowiedz

2

Musisz dołączyć detektor zdarzeń do SharedEventManager i odsłuchać MvcEvent :: EVENT_DISPATCH interfejsu "Zend \ Stdlib \ DispatchableInterface".

Zobacz przykład:

$eventManager->getSharedManager() 
      ->attach(
       'Zend\Stdlib\DispatchableInterface', 
       MvcEvent::EVENT_DISPATCH, 
       $serviceManager->get('MyListener') 
      ); 

w swoim słuchacza można uzyskać instancję kontrolera docelowego jak tak $ controller = $ Event-> getTarget();

Więc ostatecznie, metoda "setLayout" może wyglądać następująco:

public function setLayout(MvcEvent $event) 
{ 
    $controller = $event->getTarget(); 

    if ($controller instanceof MyController) 
    { 
     $event->getViewModel()->setTemplate('mycontroller-layout'); 
    } 
} 
+0

Dzięki, pomogło mi to w moim przypadku. –

5

Ci się wszystkie moduły mają onBootstrap() sposób wszystkie kontrolery rozciągające AbstractController mieć onDispatch() metoda.

Zważywszy chcesz zastosować inny układ dla jednego konkretnego sterownika, wystarczy wykonać następujące czynności:

<?php 

namespace MyModule\Controller; 

use Zend\Mvc\Controller\AbstractActionController; // Or AbstractRestfulController or your own 
use Zend\View\Model\ViewModel; // Or JsonModel or your own 
use Zend\Mvc\MvcEvent; 

class MyController extends AbstractActionController 
{ 
    public function onDispatch(MvcEvent $e) 
    { 
     $this -> layout('my-layout'); // The layout name has been declared somewhere in your config 
     return parent::onDispatch($e); // Get back to the usual dispatch process 
    } 

    // ... Your actions 
} 

Można to zrobić dla każdego kontrolera, który posiada specjalny układ. Dla tych, którzy tego nie robią, cóż, nie musisz nic pisać.

Jeśli często trzeba zmienić układ (na przykład trzeba obsługiwać nie jeden kontroler, ale kilka), można dołączyć MvcEvent do swojego modułu.php, aby uzyskać kod ustawienia układu w jednym miejscu.

Aby zachować prostotę, nie używam tutaj niestandardowego detektora, ale można również użyć jednego z nich.

<?php 

namespace MyModule; 

use Zend\Mvc\MvcEvent; 

class Module 
{ 
    public function onBootstrap(MvcEvent $e) 
    { 
     $eventManager = $e -> getApplication() -> getEventManager(); 
     $eventManager -> attach(
      MvcEvent::EVENT_DISPATCH, 
      // Add dispatch error event only if you want to change your layout in your error views. A few lines more are required in that case. 
      // MvcEvent::EVENT_DISPATCH | MvcEvent::EVENT_DISPATCH_ERROR 
      array($this, 'onDispatch'), // Callback defined as onDispatch() method on $this object 
      100 // Note that you don't have to set this parameter if you're managing layouts only 
     ); 
    } 

    public function onDispatch(MvcEvent $e) 
    { 
     $routeMatch = $e -> getRouteMatch(); 
     $routeParams = $routeMatch -> getParams(); 
     switch ($routeParams['__CONTROLLER__']) { 
      // You may use $routeParams['controller'] if you need to check the Fully Qualified Class Name of your controller 
      case 'MyController': 
       $e -> getViewModel() -> setTemplate('my-first-layout'); 
       break; 
      case 'OtherController': 
       $e -> getViewModel() -> setTemplate('my-other-layout'); 
       break; 
      default: 
       // Ignore 
       break; 
     } 
    } 

    // Your other module methods... 
} 
+0

Aby dodać niestandardowe układy na podstawie tras zamiast kontrolerów, spójrz [tutaj] (https://github.com/Hounddog/HdRouteLayouts/blob/master/Module.php). Zezwala na różne układy na podstawie tras, w tym symboli wieloznacznych (na przykład 'admin/* '). – Nukeface

Powiązane problemy