2

私は現在、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()!";
}

この問題で私を助けてくれる人はいますか?最終的に私がここで誤解していることを教えてくれますか? どんな助けでも大歓迎です:)

4

3 に答える 3

1

Zend Framework 2 のモジュール固有のレイアウトに関する Evan Coury の投稿は、解決策を提供しているようです。

http://web.archive.org/web/20140623024023/http://blog.evan.pro/module-specific-layouts-in-zend-framework-2

于 2012-10-24T06:45:33.990 に答える
1

Pls は受け入れが正しくないことに注意してください。OP によって投稿されたコードは機能しません。分野横断的な懸念で onBootstrap を汚染しないでください。この理由:

public function __construct() {
    $this->getEventManager()->attach('dispatch', array($this, 'preDispatch'), 1000);
    echo "construct";
}

うまくいかなかったのは、イベントマネージャーが構築後に接続され、ディスパッチ時に発火するためです。

「出荷後、かなり時間がたってから工場に電話する」というコメントも意味がありません。工場の仕事を知っていますか?

"Mr. O'phinney" による提案は正しい方法です。マシューのような誰かがあなたを失望させると判断する前に、次回はマニュアルをよく読んでください..

解決策はこちら: http://mwop.net/blog/2012-07-30-the-new-init.html

于 2013-11-21T21:48:20.523 に答える
1

工場はディスパッチが処理されてから長時間呼び出されるため、工場からのディスパッチに添付することはできません。

これを機能させるには、Module.php を開いて onBootstrap() を編集し、そこにアタッチします。例えば:

public function onBootstrap($e)
{
    ...
    $eventManager = $e->getApplication()->getEventManager();
    $eventManager->attach("dispatch", function($e) {
        echo "Dispatch!";
    });
}

または、特定のコントローラーからこれを行うこともできます。コンストラクターではなく、setEventManager をオーバーライドします。

public function setEventManager(EventManagerInterface $events) {
    parent::setEventManager($events);
    $controller = $this;
    $events->attach("dispatch", function($e) use ($controller) {
        echo "Dispatch!";
    });
}

お役に立てれば!

于 2012-12-19T12:48:09.940 に答える