2

zf2でコードをトレースすると、アプリケーションサービスが登録されている場所が見つかりません。これがapplication.phpのコードです

public static function init($configuration = array())
{
    $smConfig = isset($configuration['service_manager']) ? $configuration['service_manager'] : array();
    $serviceManager = new ServiceManager(new Service\ServiceManagerConfig($smConfig));
    $serviceManager->setService('ApplicationConfig', $configuration);
    $serviceManager->get('ModuleManager')->loadModules();
    return $serviceManager->get('Application')->bootstrap();
}

コード「$serviceManager->get('Application')」は、アプリケーションサービスを取得するためのものです。しかし、アプリケーションサービスはどこに登録されましたか?

次に、アプリケーションサービスがZF2 / library / Zend/MoudleManagerのコード行「$this->getEventManager()-> trigger(ModuleEvent :: EVENT_LOAD_MODULES_POST、$ this、$ this-> getEvent())」に関連していることがわかりました。 /MoudleManager.php

public function loadModules()
{
    if (true === $this->modulesAreLoaded) {
        return $this;
    }

    $this->getEventManager()->trigger(ModuleEvent::EVENT_LOAD_MODULES, $this, $this->getEvent());

    /**
     * Having a dedicated .post event abstracts the complexity of priorities from the user.
     * Users can attach to the .post event and be sure that important
     * things like config merging are complete without having to worry if
     * they set a low enough priority.
     */
    $this->getEventManager()->trigger(ModuleEvent::EVENT_LOAD_MODULES_POST, $this, $this->getEvent());

    return $this;
}

もう1つの質問は、「ModuleEvent :: EVENT_LOAD_MODULES_POST、つまりloadModules.postです。トリガー関数の最初のパラメーターは関数名です。loadModules.postも関数ですか?どこで定義されましたか?

前もって感謝します。

4

2 に答える 2

3

最初に最後の質問に答えます。トリガーメソッドの最初のパラメーターは関数ではなく、単なる名前です。慣例により、その名前は通常、トリガーされるメソッドを反映しており、オプションで、より多くのコンテキスト( ".pre"、 "。post"など)を与えるためのサフィックスが付いています。

「loadModules.post」は、ModuleManager::loadModules()すべてのモジュールがロードされるとトリガーされるイベントです。イベントがトリガーされると、そのイベントのリスナーは、指定されたパラメーターを使用してトリガーされます。イベントオブジェクト自体にも「ターゲット」があり、この場合はModuleManagerになります。

「アプリケーション」サービスに関しては、MVCレイヤーの内部を調べる必要があります。ほとんどのMVCサービスはで定義されていZend\Mvc\Service\ServiceListenerFactoryます。そのクラスを見ると、アプリケーションインスタンスを作成するためApplicationにを使用するように割り当てられていることがわかります。Zend\Mvc\Service\ApplicationFactoryServiceListenerFactory、ModuleManagerを作成するファクトリの一部として取得されます。少し間接的ですが、関係は操作の順序とオブジェクト間の関係によって定義されます。

于 2013-01-17T22:31:30.927 に答える
1

Zend \ ServiceManager \ ServiceManagerに登録されているサービスのほとんどは、Zend\Mvc\Service\ServiceListenerFactoryServiceListenerインスタンスを作成するときにServiceListenerファクトリによって構成されます。

デフォルトの設定は実際にはに保存されServiceListenerFactory::defaultServiceConfigます。(コードを確認すると、「アプリケーション」エイリアスがそこで定義されていることがわかります)

2番目の質問ですが、ModuleEvent :: EVENT_LOAD_MODULESは、さまざまなモジュールの読み込みイベントを識別するために使用されるModuleEvent定数の1つにすぎません。

実際には、アプリケーションによってさまざまな段階でトリガーされる4つのモジュールイベントがあります。私はまだそれらのイベントを使用する機会がありませんでした、そしてそれらは主にフレームワーク自体によって使用されていると思います。これまでのところ、Zend \ Mvc\MvcEvent関連のイベントのみを使用する機会がありました。

于 2013-01-17T16:39:07.003 に答える