私は現在、ZF2 の安定版を学習/実験しています。ここ数日は、私の問題の解決策を見つけるために使用されてきました。それは、一連のコントローラーに一般的なセットアップロジックを記述できるようにしたいということです。ZFで!次に、セットアップ ロジックに init() メソッドを使用して、一般的なコントローラーを作成し、そこから派生させます。少し検索した後、init() メソッドが ZF2 で削除され、同じ機能を得る別の方法があることがわかりました。
MW O'Phinney のガイドに従ってみました: http://mwop.net/blog/2012-07-30-the-new-init.html
私の場合、セットアップ ロジックのルート パラメータを取得してチェックできるようにする必要があるため、その時点で MvcEvent にアクセスできないため、代替をオーバーライドするメソッドが機能しませんでした。そこで、Update: serviceManager ソリューションを試しましたが、ここで行き詰まりました。最初に、コードをガイドから Module クラスにコピーし、テキストをエコーして、コールバックがまったく呼び出されたかどうかを確認しようとしました。そうではありません。
ウェブでさらに検索した後、可能な解決策を見つけました。ジェネラル コントローラーのコンストラクターにコールバックをアタッチします。ここでも同じ問題が発生しているように見えました。コンストラクターはもちろん呼び出されますが、コールバックがアタッチされていないか、適切に (またはまったく) トリガーされていません。
2 つの異なるソリューションからコードの一部を添付します。
Module.php で:
public function getControllerConfig() {
return array(
'factories' => array(
'Game\Controller\Mapsquare' => function($controllers) {
$serviceManager = $controllers->getServiceLocator();
$eventManager = $serviceManager->get('EventManager');
$controller = new Controller\MapsquareController();
echo "this text is echoed";
$eventManager->attach('dispatch', function ($e) use ($controller) {
echo "this text is NOT echoed";
$request = $e->getRequest();
$method = $request->getMethod();
if (!in_array($method, array('PUT', 'DELETE', 'PATCH'))) {
// nothing to do
return;
}
if ($controller->params()->fromRoute('id', false)) {
// nothing to do
return;
}
// Missing identifier! Redirect.
return $controller->redirect()->toRoute(/* ... */);
}, 100); // execute before executing action logic
$controller->setEventManager($eventManager);
return $controller;
}
)
);
}
MapsquareController.php (一般的なコントローラー) では:
public function __construct() {
$this->getEventManager()->attach('dispatch', array($this, 'preDispatch'), 1000);
echo "construct";
}
public function preDispatch() {
echo "This is preDispatch()!";
}
この問題で私を助けてくれる人はいますか?最終的に私がここで誤解していることを教えてくれますか? どんな助けでも大歓迎です:)