2016-09-01 3 views
1

Controller-Weiterleitung - ist ein großer Vorteil, und ich habe Widget-Konzeption damit gemacht. Aber standardmäßig kann der Controller des Nicht-Selbst-Moduls nicht gesendet werden. So beheben Sie dieses Problem, habe ich abstaract_factory für Controller constructon (und auch contoller Konfiguration überhaupt zu vermeiden):Zend2 - wie weiter andere Modul-Controller?

namespace Engine\Mvc\Controller; 

use Zend\ServiceManager\AbstractFactoryInterface; 
use Zend\ServiceManager\ServiceLocatorInterface; 

class Autoloader implements AbstractFactoryInterface 
{ 
    public function canCreateServiceWithName(ServiceLocatorInterface $locator, $name, $requestedName) 
    { 
     return true; 
    } 

    public function createServiceWithName(ServiceLocatorInterface $locator, $name, $requestedName) 
    { 
     $class = ucfirst(str_replace('/', '\\', $requestedName)).'Controller'; 
     if (!class_exists($class)){ 
      return false; 
     } 
     return new $class; 
    } 
} 

/*In Module class*/ 
public function getControllerConfig() 
    { 
     return array(
      'abstract_factories' => array(
       'Engine\Mvc\Controller\Autoloader' 
      ), 
     ); 
    } 

Es funktioniert gut. Aber nur für aufrufbare Controller - ohne Konstruktorargumente. Wenn ich versuche, Controller aus dem Modul einzubetten, dass ich nicht ändern kann (ZfcUser, mit dem Komponisten installiert, zum Beispiel) - kann es fehlschlagen, weil im diesem Fall entweder Controller nicht aufrufbaren init haben:

/*in zfc-user/module.config.php */ 
'controllers' => array(
     'factories' => array(
      'zfcuser' => 'ZfcUser\Factory\Controller\UserControllerFactory', 
     ), 
    ), 

/*factory for controller*/ 
class UserControllerFactory implements FactoryInterface 
{ 
    /** 
    * Create controller 
    * 
    * @param ControllerManager $serviceLocator 
    * @return UserController 
    */ 
    public function createService(ServiceLocatorInterface $controllerManager) 
    { 
     /* @var ServiceLocatorInterface $serviceLocator */ 
     $serviceLocator = $controllerManager->getServiceLocator(); 

     $userService = $serviceLocator->get('zfcuser_user_service'); 
     $registerForm = $serviceLocator->get('zfcuser_register_form'); 
     $loginForm = $serviceLocator->get('zfcuser_login_form'); 
     $options = $serviceLocator->get('zfcuser_module_options'); 

     $controller = new UserController($userService, $options, $registerForm, $loginForm); 

     return $controller; 
    } 
} 

Froward in module1 nicht UserControllerFactory von ZfcUser Modul, es versuchen, Controller mit meinem abstract_factory zu konstruieren, und gibt einen Fehler, weil UserController alle Argumente benötigt.

Es kann durch das Vertauschen von Zend\Mvc\Controller\Plugin\Service\ForwardFactory auflösen - müssen nur Forward mit "global" ControllerManager erstellen. Aber ich bin mir nicht sicher, "global" ControllerManager ist in Zend2 vorhanden.

Fragen:

  1. Gibt es globale Controller, wie kann ich es von Servicemanager?
  2. Alle anderen Möglichkeiten zum Versand mit Controller-Plugin weiterleiten Nicht-Selbst-Modul-Controller (mit Aufbau von Controllern durch Nicht-Selbst-Modul-Controller-Konfiguration)?
+0

siehe [link] (http://stackoverflow.com/questions/14180839/is-it-possible-to-forward-data-to-another-controller -aktion-in-zend-2) –

Antwort

0

Die Frage ist vorbei, ich bin dumm. Forward hat Zugriff auf alle Controller, auch auf Nicht-Self-Controller. Aber durch die Steuerung Pseudo (Name in Controller-Manager) - nicht durch Klassennamen, zum Beispiel haben wir Controller-Definition:

/*in zfc-user/module.config.php - here we have 'zfcuser' as controller pseudo */ 
'controllers' => array(
     'factories' => array(
      'zfcuser' => 'ZfcUser\Factory\Controller\UserControllerFactory', 
     ), 
), 

Wir können diesen Controller weiterleiten aus jedem Modul diesen Code:

$widgetLogin = $this->forward()->dispatch('zfcuser', ['action' => 'login']); 

Dank.

UPD:

Wenn Sie Namen der Klasse verwendet werden soll nur, an Steuerungen von vorn Zugriff (mit Engine \ Mvc \ Controllers \ Autoloader gleichen Namen arbeiten, von Frage löst) - Sie Alias ​​nicht hinzufügen Selbst Controller in Ihrem Modul, zum Beispiel:

/*in module.config.php of your module*/ 
'controllers' => [ 
    'abstract_factories' => [ 
     'Engine\Mvc\Controller\Autoloader' 
    ], 
    'aliases' => [ 
     'ZfcUser/Controller/User' => 'zfcuser' 
    ] 
]