1

AbstractPluginManagerと呼ばれる興味深いプロパティが$autoAddInvokableClassあり、有効にすると、呼び出そうとしたクラスが呼び出し可能なリストに自動的に追加されます。残念ながら、私の知る限り、この動作は ServiceManager 自体によって実装されていません。

この動作をアプリケーションの ServiceManager に実装して、登録しなくても$applicationServiceManager->get(SomeUnregisteredClass::class)ロードし、オブジェクトで関連するイニシャライザを実行する最良の方法は何でしょうか?SomeUnregisteredClass$applicationServiceManager

登録せずにこれを行おうとすると、SomeUnregisteredClass通常、次のような例外がスローされます。

Zend\ServiceManager\Exception\ServiceNotFoundException: Zend\ServiceManager\ServiceManager::get は SomeUnregisteredClass のインスタンスを取得または作成できませんでした

4

1 に答える 1

3

まず、この機能で作成したすべての可能性を認識してください。本当にこれが必要ですか?

autoAddInvokableClass次に、「ルート」サービス マネージャーにはプロパティがありません。ただし、独自のサービス マネージャーを作成して、それを既定のサービス マネージャーとして登録することはできます。

カスタムを作成します。

<?php
namespace MyLib\ServiceManager;

use Zend\ServiceManager as BaseServiceManager;

class ServiceManager extends BaseServiceManager
{
    protected $autoAddInvokableClass = true;

    public function get($name, $options = array(), $usePeeringServiceManagers = true)
    {
        // Allow specifying a class name directly; registers as an invokable class
        if (!$this->has($name) && $this->autoAddInvokableClass && class_exists($name)) {
            $this->setInvokableClass($name, $name);
        }

        return parent::get($name, $options, $usePeeringServiceManagers);
    }
}

コントローラーローダーを含む、すべてのサービスマネージャーがこのマネージャーから拡張されることに注意してくださいしたがって、ルートがある場合、パラメーターでFQCNを指定すると、この方法で任意のクラス/foo/:controller[/:action]をロードできます。:controller

とにかく、そうは言っても、アプリケーション構成でこの SM を有効にするだけです。

<?php
return array(
    'modules' => array(
        'Application',
        // Your module here
    ),

    'module_listener_options' => array(
        'module_paths' => array(
            './module',
            './vendor',
        ),
        'config_glob_paths' => array(
            'config/autoload/{,*.}{global,local}.php',
        ),
    ),

    // Used to create an own service manager. May contain one or more child arrays.
    'service_listener_options' => array(
        array(
            'service_manager' => 'MyLib\ServiceManager\ServiceManager',
        ),
    ),
);
于 2013-09-01T09:24:46.463 に答える