0

Zend Framework 2 は初めてです。「A」と「B」の 2 つのモジュールがあります。「A」モジュールの LoginController の LoginAction でイベントをトリガーします。LoginController の LoginAction または LoginController の testMe() メソッドをアタッチしたい。

「A」モジュールの LoginController の LoginAction には、

$this->getEventManager()->trigger('checkme.post', null, array('user_id' => $userData->usydstudentid));

「B」モジュールの Module.php では、Bootstrap メソッドで、

$loginController = new B\Controller\LoginController();

$sharedEventManager->attach('A\Controller\LoginController', 'checkme.post', array($loginController, 'LoginAction'), 100); 

「B」モジュールの LoginController の LoginAction では、データにアクセスできますが、モジュールの構成を取得するためにサービス マネージャにアクセスできません。使おうとすると

$this->getServiceLocator()->get('Config');

エラーが発生します

非オブジェクトでのメンバー関数 get() の呼び出し

つまり、あるコントローラーのメソッドからイベントをトリガーし、別のコントローラーのメソッドにアタッチしたいと考えています。聞いて、そのイベントからデータを取得した後、モジュールの構成を取得したいと思います。この点で助けてください。

4

1 に答える 1

3

まず、イベントとコントローラーをこのように使用しないでください。B のコントローラーはコントローラーではありませんが、それをサービス レイヤーに配置する必要があります。

次に、サービス ロケーターを挿入する必要があります。これを行うと$controller = new SomeController、サービスロケーターは注入されません。したがって、そこからのオブジェクトのフェッチは失敗します。あなたがすべきことは、コントローラーローダーを使用してコントローラーを取得することです。

したがって、これの代わりに:

$loginController = new B\Controller\LoginController();

$sharedEventManager->attach('A\Controller\LoginController',
                            'checkme.post',
                            array($loginController, 'LoginAction'),
                            100); 

あなたはこれを書くべきです:

// $sl is instance of Service Locator
// E.g. $sl = $e->getApplication()->getServiceManager();
// Where $e is the event from the onBootstrap() method

$loader          = $sl->get('ControllerLoader');
$loginController = $loader->get('B\Controller\LoginController');

$sharedEventManager->attach('A\Controller\LoginController',
                            'checkme.post',
                            array($loginController, 'LoginAction'),
                            100); 

しかし、前述のように、イベントを使用してこのようにコントローラーでアクションをトリガーすることは、実際には良い方法ではありません。たとえば、コントローラープラグインを使用してディスパッチするForwardか、(前に述べたように)コントローラーの LoginAction からロジックを削除して、サービスクラスなどに配置することをお勧めします。

于 2013-10-31T07:53:15.743 に答える