不要那样做!之前已经讨论过,你最终可以阅读邮件列表上的讨论,其中也有一些很好的例子。
假设您的类Test
出于某种原因需要访问服务定位器,正确的方法是使用服务定位器将其实例化为硬依赖:
use Zend\ServiceManager\ServiceLocatorInterface;
class Test extends AbstractModel
{
// ...
public function __construct(ServiceLocatorInterface $serviceLocator)
{
$this->serviceLocator = $serviceLocator;
}
public function doFoo()
{
return $this->serviceLocator->get('FooService')->foo();
}
// ...
}
这样,您可以使用它来实例化它$test = new Test($serviceLocator);
或在工厂中定义它,并让服务定位器本身为您提供一个实例:
namespace MyApp;
use Zend\ModuleManager\Feature\ServiceProviderInterface;
class Module implements ServiceProviderInterface
{
public function getServiceConfig()
{
return array(
'factories' => array(
'Test' => function ($serviceLocator) {
return new \Test($serviceLocator);
},
),
);
}
}
这基本上使服务'Test'
在您的应用程序中可用。
无论如何,您刚刚创建的内容有两个大缺陷:
如果您有兴趣,我还写了一篇关于为什么应该使用使用 IOC 而不是服务位置的博文(第二段描述了服务位置的陷阱)。