2

ビルドしようとしている 2 つの MVC モジュールがあり、1 つ (FBWsrv) は JSON 出力と異なるセキュリティ プロセス、および通常の Web 用のメイン MVC モジュール (FBWeb) です。私はすべてのルートをセットアップし、ほとんどが機能しています。私が直面している問題は、どちらにも独自のイベント リスナーをアタッチする onBootstrap メソッドがあり、正しい MVC モジュールにない場合はリスナーを無効にしたいということです。

私のルートは次のようになります。

モジュール FBWeb、URL の「アプリ」モジュール:

/app/controller/action/par1/val1

モジュール FBWsrv。URL の「wsrv」:

/wsrv/controller/action/par1/val1

前述したように、ルートは正常に機能しています。正しいコントローラーとアクションにたどり着きました。しかし問題は、/wsrv ルートから /app を実行していないときに、MVC イベント リスナーが両方のモジュールで実行されていることです。私がしたいことは、/wsrv にいる場合に /app のイベントを無効にすることです。

モジュールの短いバージョンは次のようにセットアップされます。

FBWeb/Module.php:

class Module 
{

    public function onBootstrap(MvcEvent $e)
    {

        $this->sm = $application->getServiceManager();
        $this->config = $e->getApplication()->getConfig();

        $eventManager        = $e->getApplication()->getEventManager();
        $moduleRouteListener = new ModuleRouteListener();
        $moduleRouteListener->attach($eventManager);

        $eventManager->attach( \Zend\Mvc\MvcEvent::EVENT_DISPATCH, array($this, 'addInstanceObjects'), 5000 );
        $eventManager->attach( \Zend\Mvc\MvcEvent::EVENT_DISPATCH, array($this, 'securityDispatch'), 0 );
        $eventManager->attach( \Zend\Mvc\MvcEvent::EVENT_DISPATCH, array($this, 'preDispatch'), 100 );
        $eventManager->attach( \Zend\Mvc\MvcEvent::EVENT_DISPATCH, array($this, 'postDispatch'), -100 );
        $eventManager->attach( \Zend\Mvc\MvcEvent::EVENT_DISPATCH_ERROR, array($this, 'onDispatchError'), -5000);

    }

FBWsrv/Module.php:

class Module 
{
    public function onBootstrap(MvcEvent $e)
    {

        $this->sm = $application->getServiceManager();
        $this->config = $e->getApplication()->getConfig();
        $eventManager        = $e->getApplication()->getEventManager();
        $moduleRouteListener = new ModuleRouteListener();
        $moduleRouteListener->attach($eventManager);

        $eventManager->attach( \Zend\Mvc\MvcEvent::EVENT_DISPATCH, array($this, 'addWsrvInstanceObjects'), 5900 );
        //$eventManager->attach( \Zend\Mvc\MvcEvent::EVENT_DISPATCH, array($this, 'securityWsrvDispatch'), 5800 );
        $eventManager->attach( \Zend\Mvc\MvcEvent::EVENT_DISPATCH, array($this, 'preWsrvDispatch'), 5500 );
        $eventManager->attach( \Zend\Mvc\MvcEvent::EVENT_DISPATCH, array($this, 'postWsrvDispatch'), 5400 );
        $eventManager->attach( \Zend\Mvc\MvcEvent::EVENT_DISPATCH_ERROR, array($this, 'onWsrvDispatchError'), 5100);

    }

テスト中は FBWsrv で securityWsrvDispatch を無効にしていますが、後で独自のプロセスを実行したいと考えています。今のところ、FBWsrv で実行している場合は関連性がないため、FBWeb イベントをデタッチする必要があります。反対側のモジュールにエラーが表示されるため、それらがすべて実行されていることがわかります。これを行う方法がわからない。

助けてくれてありがとう!

グレッグ

編集/メモ:リスナーをアタッチする前にNAMESPACEの簡単なチェックを追加しようとしましたが、両方の名前空間が常に呼び出され、1 つだけが必要な場合でも両方のモジュールのリスナーが作成されるようです。それらをどのように隔離しますか?私はこれを試しましたが、うまくいきません:

if(__NAMESPACE__ == 'FBWeb'){
            $eventManager->attach( \Zend\Mvc\MvcEvent::EVENT_DISPATCH, array($this, 'addInstanceObjects'), 5000 );
         ...

Avar_dump(__NAMESPACE__);は常に両方の名前空間を表示します。

編集 - ちょっとした回避策

まず、Andrew に感謝します。あなたは、私がこのプロジェクトに取り組もうとしているいくつかのアイデアに火をつけました。しかし、私が学習している間、ルートをチェックし、一致しない場合は単に関数から戻り、モジュール内の追加のセットアップをスキップすることで、主な問題を解決しました。

また、ディスパッチ イベントを統合したことで、混乱が軽減されました。余分な混乱は本当に必要ありませんでした。これが正しい方法ではないことはわかっていますが、問題は解決しました。

(もちろん、モジュールに合わせて「fbweb」および「fbwsrv」という名前のルートを設定する必要があります)

FBWeb/Module.php:

// in FBWeb/Module.php
// (default web MVC module)

public function onBootstrap(MvcEvent $e)
{
    // ... get eventmanager ...

    $eventManager->attach( \Zend\Mvc\MvcEvent::EVENT_DISPATCH, array($this, 'preDispatch'), 1000 );
    $eventManager->attach( \Zend\Mvc\MvcEvent::EVENT_DISPATCH_ERROR, array($this, 'onDispatchError'), -5000);

}

public function preDispatch(MvcEvent $e)
{
    $this->route = $e->getRouteMatch();
    $this->matchedRouteName = explode('/', $this->route->getMatchedRouteName());
    $this->route_root = $this->matchedRouteName[0];

    // then just test if not in correct route
    if($this->route_root != 'fbweb'){
        // if NOT, bail here, 
        // and skip any other setup in this module dispatch
        return;
    }

    // continue other normal stuff (ACL's, session stuff, etc)
    // ...

}

私の他のモジュール: FBWsrv/Module.php:

// in FBWsrv/Module.php

public function onBootstrap(MvcEvent $e)
{
    // ... get eventmanager ...

    $eventManager->attach( \Zend\Mvc\MvcEvent::EVENT_DISPATCH, array($this, 'preDispatch'), 5500 );
    $eventManager->attach( \Zend\Mvc\MvcEvent::EVENT_DISPATCH_ERROR, array($this, 'onDispatchError'), -4900);

}

public function preDispatch(MvcEvent $e)
{
    $this->route = $e->getRouteMatch();
    $this->matchedRouteName = explode('/', $this->route->getMatchedRouteName());
    $this->route_root = $this->matchedRouteName[0];
    // then just test if not in correct route
    if($this->route_root != 'fbwsrv'){
        // if NOT, bail here, 
        // and skip any other setup in this module dispatch
        return;
    }

    // continue other normal stuff (ACL's, session stuff, etc)
    // ...

}
4

1 に答える 1