2016-09-01 3 views
1

コントローラフォワーディングは素晴らしい機能であり、私はそれを使ってウィジェットの概念を作った。しかし、デフォルトでは非自己モジュールのコントローラをディスパッチできません。 (とも全くcontoller構成を避けるために)この問題を解決するために、私は、コントローラconstructonためabstaract_factory追加:Zend2 - 他のモジュールコントローラを転送するには?

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' 
      ), 
     ); 
    } 

それは正常に動作します。ただし、コンストラクタ引数を持たない、呼び出し可能なコントローラのみ。私は私が(例えば作曲、一緒にインストールZfcUserを)変更することができないことを、モジュールからコントローラを埋め込むしようとする - それが失敗することがあり、theeseコントローラは非呼び出し可能なのinitを持つことができるので:

/*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; 
    } 
} 

偏屈でmodule1UserControllerFactoryZfcUserモジュールでは、私のabstract_factoryでコントローラを構築しようとしていて、UserControllerがすべての引数を必要とするため、エラーが発生します。

Zend\Mvc\Controller\Plugin\Service\ForwardFactoryをスワップすることで解決できる場合があります。「グローバル」の転送を構築する必要があるのはControllerManagerです。しかし、私は確信していません、 "グローバル" ControllerManagerはZend2に存在します。

質問

  1. 私はServiceManagerからそれを得ることができる方法がグローバルControllerManager、ですか?
  2. コントローラー・プラグインを使用してディスパッチするその他の方法非自己モジュール・コントローラー(非自己モジュール・コントローラー構成によってコントローラーを構成しています)?
+0

[リンク](http://stackoverflow.com/questions/14180839/is-it-possible-to-forward-data-to-another-controllerを参照してください。 -action-in-zend-2) –

答えて

0

質問がなくなった、私はばかです。フォワードは、すべてのコントローラーにアクセスすることができ、非自己コントローラーにもアクセスできます。しかし、コントローラの擬似(コントローラマネージャ内の名前)で - ないクラス名で、例えば私たちは、コントローラの定義があります。

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

我々は任意のモジュールからこのコードをこのコントローラに転送することができます

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

感謝を。

UPD:

あなたは(質問解決から同じ名前エンジン\ MVC \コントローラ\オートローダで動作するように)前方からコントローラにアクセスするには、唯一のクラスの名前を使用する場合 - あなたは非にエイリアスを追加することができます例えば、あなたのモジュール内の自己コントローラ、:

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