Zend framework2 对ZF2中的非对象调用成员函数get()

Zend framework2 对ZF2中的非对象调用成员函数get(),zend-framework2,Zend Framework2,我正试图从另一个模块B调用我的模块a的函数。我是通过在模块B的控制器中创建模块a的控制器的实例来实现的。虽然我可以调用此函数,但它无法访问任何以get开头的函数,如getServiceLocator()、getRequestUri()。 所有这些错误都是在我尝试跨模块而不是单个模块工作时出现的。 我该如何处理这件事 class IndexController extends AbstractActionController { public function indexAction()

我正试图从另一个模块B调用我的模块a的函数。我是通过在模块B的控制器中创建模块a的控制器的实例来实现的。虽然我可以调用此函数,但它无法访问任何以get开头的函数,如getServiceLocator()、getRequestUri()。 所有这些错误都是在我尝试跨模块而不是单个模块工作时出现的。 我该如何处理这件事

class IndexController extends AbstractActionController
{
public function indexAction()
    {
    $sm=($this->getServiceLocator());
    $newControl=new ChatController($sm);
    $newControl->get_html_code();

    }
}
在这里,我将$sm传递给控制器,因为我无法使用ChatController的getServiceLocator()。类似地,我不能使用getRequestUri()

控制器是一个代理,它将请求中的信息委托给模型层。此操作(命令或查询)的结果通过返回给客户端的视图进行。如果要重用逻辑,通常在模型层而不是控制器中进行。TL;DR:创建一个服务层并重用来自服务的逻辑,而不是来自控制器的逻辑。不要自己实例化控制器

在您的情况下,您可能有一个具有某种逻辑的聊天控制器

namespace Chat\Controller;
类控制器
{
公共函数索引()
{
//对请求做点什么
//这里可能有一些域逻辑
//返回此处查看
}
}
为了代码的可重用性,最好在您的域中有域逻辑。现在最简单的方法是创建服务层:

namespace Chat\Service;
课堂聊天服务
{
公共职能
{
//现在将您的域逻辑放在这里
}
}
现在,您可以使ChatController依赖于ChatService。您可以在控制器中插入服务:

使用Chat\Service\ChatService;
类控制器
{
受保护的服务;
公共函数构造(ChatService$service)
{
$this->service=$service;
}
}
现在您只需在服务管理器中注册聊天服务,并为控制器注册工厂。在您的配置中:

“服务管理器”=>阵列(
'invokables'=>数组(
'Chat\Service\ChatService'=>'Chat\Service\ChatService'
),
),
“控制器”=>阵列(
“工厂”=>数组(
'Chat\Controller\ChatController'=>'Chat\Factory\ChatControllerFactory'
),
),
剩下的是您的控制器工厂:

namespace Chat\Factory;
使用Chat\Controller\ChatController;
使用Zend\ServiceManager\FactoryInterface;
使用Zend\ServiceManager\ServiceLocator接口;
类ChatControllerFactory实现FactoryInterface
{
公共函数createService(ServiceLocatorInterface$sl)
{
$sl=$sl->getServiceLocator();
$service=$sl->get('Chat\service\ChatService');
$controller=新的ChatController($service);
返回$controller;
}
}
重新使用服务


现在,如果您有一个需要ChatModule中某些逻辑的FooModule,请为该Foo控制器创建一个工厂,注入聊天服务,您就完成了。

请显示相关代码,我们无法帮助您实现这一点。您是说您在另一个控制器类中直接实例化控制器实例吗?通过在ControllerB类中使用新的ControllerA,我添加了一些代码@JurianSluiman。如果您需要更具体的内容,请务必告诉我。@guessimtoolate是的,没错。您能解释一下为什么要实例化ChatController吗?用例是什么,您试图解决什么问题。可能还有比这更好的方法。我可以从服务层调用ChatController函数吗?请再次阅读我的回答:不,不要为此重用控制器。在另一层重用代码。感谢所有的指导。我试过这个。但是我需要在ChatService中使用$service->getServiceLocator()。当我尝试这个的时候,我得到了和以前一样的错误。基本上,我的域逻辑需要访问数据库,所以我需要使用这些函数。您的思路是正确的。您需要再次获取服务定位器,这是正确的。如果你想知道原因,请阅读我不久前写的一篇博文,谢谢先生!你的回答确实帮助我理清了我的概念。