如何访问 ZF3 控制器内的服务定位器对象?
How to access service locator object inside a controller in ZF3?
我正在尝试访问控制器内的服务定位器对象,但无法执行此操作。
我尝试了在线帮助,但大多数人都遵循 ZF2
的方法
以前 zf2
中的 Servicelocator 访问是轻而易举的,我只需要做 $this->getServiceLocator();
我已经尝试为我的控制器创建工厂 Class 并在那里创建了 createService 方法,但它说我也必须实现 __invoke()
方法。
我的Objective就是这样
public function getPropertyTable()
{
if (!$this->PropertyTable) {
$sm = $this->getServiceLocator();
$this->PropertyTable = $sm->get('Application\Model\PropertyTable');
}
return $this->PropertyTable;
}
任何人都可以为我提供实现此目标的完整步骤吗?
在问这个问题之前,我已经尝试实现几乎所有与 Servicelocator 相关的答案,所以请在将其标记为重复或其他内容之前帮助我,忽略错别字
只要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);
}
在 ZF3 中,不建议将服务定位器传递给控制器。
您需要从控制器工厂内的 $container 获取所有依赖项,并通过构造函数(或设置器)将它们传递到控制器中。
感谢大家告诉我我做错了。
对这个主题的更多研究帮助我解决了我的问题
以下是我为解决该问题所做的工作
为你的控制器创建工厂class
您必须为您的控制器创建一个工厂 class,它将实现 zend 的 FactoryInterface。
在那里你必须打电话
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
return new ListController($container->get(PropertyInterface::class));
}
在这里,我传递了 属性 接口引用,它由我的另一个 table 实现,称为 属性 Table,其中我已经为模型 [=28= 的所有接口函数提供了主体]
喜欢搜索属性()
在配置文件 module.config.php 中为您的控制器添加工厂 class
指示配置文件让我们的工厂为我们的控制器创建对象
'controllers' => [
'factories' => [
// Update the following line:
Controller\ListController::class => Factory\ListControllerFactory::class,
],
],
在配置文件中注册您的模型
您必须为服务管理器添加新部分并在那里提供您的模型 classes。
// Add this section:
'service_manager' => [
'aliases' => [
Model\PropertyInterface::class => Model\PropertyTable::class,
],
'factories' => [
Model\PropertyTable::class => InvokableFactory::class,
],
],
现在唯一剩下的就是在你的 属性 接口中添加函数并在 属性Table 中为它们添加函数,然后在你的控制器中调用它们
这 Complete Steps for implementation 帮助我实施了新流程。
感谢社区。你们都是最棒的。
另一种方式
/**
* Retrieve service manager instance
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
* @return ContainerInterface
*/
public function getServiceLocator()
{
return $this->getEvent()->getApplication()->getServiceManager();
}
我正在尝试访问控制器内的服务定位器对象,但无法执行此操作。
我尝试了在线帮助,但大多数人都遵循 ZF2
以前 zf2
中的 Servicelocator 访问是轻而易举的,我只需要做 $this->getServiceLocator();
我已经尝试为我的控制器创建工厂 Class 并在那里创建了 createService 方法,但它说我也必须实现 __invoke()
方法。
我的Objective就是这样
public function getPropertyTable()
{
if (!$this->PropertyTable) {
$sm = $this->getServiceLocator();
$this->PropertyTable = $sm->get('Application\Model\PropertyTable');
}
return $this->PropertyTable;
}
任何人都可以为我提供实现此目标的完整步骤吗?
在问这个问题之前,我已经尝试实现几乎所有与 Servicelocator 相关的答案,所以请在将其标记为重复或其他内容之前帮助我,忽略错别字
只要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);
}
在 ZF3 中,不建议将服务定位器传递给控制器。 您需要从控制器工厂内的 $container 获取所有依赖项,并通过构造函数(或设置器)将它们传递到控制器中。
感谢大家告诉我我做错了。
对这个主题的更多研究帮助我解决了我的问题
以下是我为解决该问题所做的工作
您必须为您的控制器创建一个工厂 class,它将实现 zend 的 FactoryInterface。 在那里你必须打电话
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
return new ListController($container->get(PropertyInterface::class));
}
在这里,我传递了 属性 接口引用,它由我的另一个 table 实现,称为 属性 Table,其中我已经为模型 [=28= 的所有接口函数提供了主体]
喜欢搜索属性()
指示配置文件让我们的工厂为我们的控制器创建对象
'controllers' => [
'factories' => [
// Update the following line:
Controller\ListController::class => Factory\ListControllerFactory::class,
],
],
您必须为服务管理器添加新部分并在那里提供您的模型 classes。
// Add this section:
'service_manager' => [
'aliases' => [
Model\PropertyInterface::class => Model\PropertyTable::class,
],
'factories' => [
Model\PropertyTable::class => InvokableFactory::class,
],
],
现在唯一剩下的就是在你的 属性 接口中添加函数并在 属性Table 中为它们添加函数,然后在你的控制器中调用它们
这 Complete Steps for implementation 帮助我实施了新流程。
感谢社区。你们都是最棒的。
另一种方式
/**
* Retrieve service manager instance
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
* @return ContainerInterface
*/
public function getServiceLocator()
{
return $this->getEvent()->getApplication()->getServiceManager();
}