我正在尝试访问控制器内的服务定位器对象,但无法执行此操作
我尝试过在线帮助,但大多数人都在关注ZF2
以前在zf2
访问Servicelocator是轻而易举的,我只需要做这个 - >> getServiceLocator();
我已尝试为我的控制器创建工厂类,并在那里创建了createService方法,但它说我也必须实现__invoke()
方法。
我的目标是做这样的事情
public function getPropertyTable()
{
if (!$this->PropertyTable) {
$sm = $this->getServiceLocator();
$this->PropertyTable = $sm->get('Application\Model\PropertyTable');
}
return $this->PropertyTable;
}
任何人都可以为我提供完整的步骤吗?
在问这个问题之前,我曾试图实现几乎所有与Servicelocator相关的答案,所以请在将此标记为重复之前帮助我,忽略错别字
答案 0 :(得分:3)
谢谢大家告诉我,我做错了。
关于这个主题的更多研究帮助我解决了我的问题。这就是我为解决这个问题所做的工作
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
return new ListController($container->get(PropertyInterface::class));
}
这里我传递的是PropertyInterface引用,它是由我的另一个名为Property Table的表实现的,其中我已经为我的所有接口函数提供了body用于模型
喜欢searchProperty()
'controllers' => [
'factories' => [
// Update the following line:
Controller\ListController::class => Factory\ListControllerFactory::class,
],
],
// Add this section:
'service_manager' => [
'aliases' => [
Model\PropertyInterface::class => Model\PropertyTable::class,
],
'factories' => [
Model\PropertyTable::class => InvokableFactory::class,
],
],
现在只剩下你的PropertyInterface中的函数和PropertyTable中的Implentation,然后在你的控制器中调用它们
这 Complete Steps for implementation 帮助我实施新流程。
感谢社区。你们都是最好的。
答案 1 :(得分:2)
只要ZF3中的新工厂界面是:
interface FactoryInterface
{
/**
* Create an object
*
* @param ContainerInterface $container
* @param string $requestedName
* @param null|array $options
* @return object
*/
public function __invoke(ContainerInterface $container, $requestedName, array $options = null);
}
你必须像这样实施你的工厂。
为了帮助您,您可以使用link
编辑:
在实践中你应该有这个:
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
$propertyTable = $container->get('Application\Model\PropertyTable');
return new Controller($propertyTable);
}
答案 2 :(得分:0)
另一种方式
/**
* Retrieve service manager instance
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
* @return ContainerInterface
*/
public function getServiceLocator()
{
return $this->getEvent()->getApplication()->getServiceManager();
}
答案 3 :(得分:-1)
在ZF3中,不建议将服务定位器传递给控制器。 您需要从控制器工厂内的$ container获取所有依赖项,并通过构造函数(或setter)将它们传递给控制器。