我试图从另一个模块B调用我的模块A的一个函数。我这样做是通过在B模块的控制器中创建一个A模块的控制器实例。虽然我可以调用这个函数,但是它无法像getServiceLocator()、getRequestUri()这样在开始时访问任何get函数。当我尝试跨模块工作而不是在一个模块上工作时,所有这些错误都会出现。我该怎么处理呢?
class IndexController extends AbstractActionController
{
public function indexAction()
{
$sm=($this->getServiceLocator());
$newControl=new ChatController($sm);
$newControl->get_html_code();
}
}在这里,我将$sm传递给Controller,因为我不能使用ChatController的getServiceLocator()。类似地,我不能使用getRequestUri()。
发布于 2014-07-01 07:08:58
Controller是一个代理,它将来自请求的信息委托给模型层。这(命令或查询)的结果是通过返回给客户端的视图。如果您想重用逻辑,您经常在模型层,而不是在控制器中这样做。TL;DR:创建一个服务层并重用来自服务的逻辑,而不是来自控制器的逻辑。做,而不是自己实例化控制器。
在您的例子中,您可能有一个具有某种逻辑的ChatController
namespace Chat\Controller;
class ChatController
{
public function indexAction()
{
// do something with the request
// you probably have some domain logic here
// return to view here
}
}为了代码的可重用性,最好在您的域中有域逻辑。现在最简单的方法是创建一个服务层:
namespace Chat\Service;
class ChatService
{
public function doChat()
{
// place your domain logic here now
}
}现在您可以将ChatController 依赖于ChatService上的。您可以将服务注入控制器中:
use Chat\Service\ChatService;
class ChatController
{
protected $service;
public function __construct(ChatService $service)
{
$this->service = $service;
}
}现在只需要在服务管理器中注册聊天服务,并为控制器注册一个工厂。在您的配置中:
'service_manager' => array(
'invokables' => array(
'Chat\Service\ChatService' => 'Chat\Service\ChatService'
),
),
'controllers' => array(
'factories' => array(
'Chat\Controller\ChatController' => 'Chat\Factory\ChatControllerFactory'
),
),剩下的是你的控制器工厂:
namespace Chat\Factory;
use Chat\Controller\ChatController;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class ChatControllerFactory implements FactoryInterface
{
public function createService(ServiceLocatorInterface $sl)
{
$sl = $sl->getServiceLocator();
$service = $sl->get('Chat\Service\ChatService');
$controller = new ChatController($service);
return $controller;
}
}重用服务
现在,如果您有一个需要来自FooModule的逻辑的ChatModule,那么为这个Foo控制器创建一个工厂,注入聊天服务,您就完成了。
https://stackoverflow.com/questions/24484716
复制相似问题