AbstractPluginManager
有一个名为$autoAddInvokableClass
的有趣属性,启用后会自动将您尝试调用的任何类添加到其invokable列表中。不幸的是,据我所知,ServiceManager本身并没有实现这种行为。
在应用程序的ServiceManager中实现此行为的最佳方法是什么,$applicationServiceManager->get(SomeUnregisteredClass::class)
即使没有使用SomeUnregisteredClass
注册它也会加载$applicationServiceManager
,因此仍然会在SomeUnregisteredClass
上运行任何相关的初始值设定项。对象
尝试在不注册{{1}}的情况下执行此操作通常会抛出类似于以下内容的异常。
的Zend \的ServiceManager \异常\ ServiceNotFoundException的: Zend \ ServiceManager \ ServiceManager :: get无法获取或创建 SomeUnregisteredClass的实例
答案 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',
),
),
);