ZF2:如何将Application ServiceManager配置为自动添加类?

时间:2013-08-31 16:15:48

标签: zend-framework2 service-locator

AbstractPluginManager有一个名为$autoAddInvokableClass的有趣属性,启用后会自动将您尝试调用的任何类添加到其invokable列表中。不幸的是,据我所知,ServiceManager本身并没有实现这种行为。

在应用程序的ServiceManager中实现此行为的最佳方法是什么,$applicationServiceManager->get(SomeUnregisteredClass::class)即使没有使用SomeUnregisteredClass注册它也会加载$applicationServiceManager,因此仍然会在SomeUnregisteredClass上运行任何相关的初始值设定项。对象

尝试在不注册{{1}}的情况下执行此操作通常会抛出类似于以下内容的异常。

  

的Zend \的ServiceManager \异常\ ServiceNotFoundException的:   Zend \ ServiceManager \ ServiceManager :: get无法获取或创建   SomeUnregisteredClass的实例

1 个答案:

答案 0 :(得分:3)

首先,请了解您使用此功能创建的所有可能性:您真的需要这个吗?

然后,“root”服务管理器没有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);
    }
}

请注意所有服务管理器将从此扩展,包括控制器加载程序。因此,如果您有路由/foo/:controller[/:action],则可以在:controller参数中指定FQCN时以这种方式加载 ANY 类!

无论如何,就是说,只需在应用程序配置中启用此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',
        ),
    ),
);