首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用ZF2中非对象上的成员函数get()

问调用ZF2中非对象上的成员函数get()
EN

Stack Overflow用户
提问于 2014-06-30 07:13:54
回答 1查看 1.8K关注 0票数 1

我试图从另一个模块B调用我的模块A的一个函数。我这样做是通过在B模块的控制器中创建一个A模块的控制器实例。虽然我可以调用这个函数,但是它无法像getServiceLocator()、getRequestUri()这样在开始时访问任何get函数。当我尝试跨模块工作而不是在一个模块上工作时,所有这些错误都会出现。我该怎么处理呢?

代码语言:javascript
复制
class IndexController extends AbstractActionController
{
public function indexAction()
    {
    $sm=($this->getServiceLocator());
    $newControl=new ChatController($sm);
    $newControl->get_html_code();

    }
}

在这里,我将$sm传递给Controller,因为我不能使用ChatController的getServiceLocator()。类似地,我不能使用getRequestUri()。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-01 07:08:58

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

在您的例子中,您可能有一个具有某种逻辑的ChatController

代码语言:javascript
复制
namespace Chat\Controller;

class ChatController
{
    public function indexAction()
    {
        // do something with the request

        // you probably have some domain logic here

        // return to view here
    }
}

为了代码的可重用性,最好在您的域中有域逻辑。现在最简单的方法是创建一个服务层:

代码语言:javascript
复制
namespace Chat\Service;

class ChatService
{
    public function doChat()
    {
         // place your domain logic here now
    }
}

现在您可以将ChatController 依赖于ChatService上的。您可以将服务注入控制器中:

代码语言:javascript
复制
use Chat\Service\ChatService;

class ChatController
{
    protected $service;

    public function __construct(ChatService $service)
    {
        $this->service = $service;
    }

}

现在只需要在服务管理器中注册聊天服务,并为控制器注册一个工厂。在您的配置中:

代码语言:javascript
复制
'service_manager' => array(
    'invokables' => array(
        'Chat\Service\ChatService' => 'Chat\Service\ChatService'
    ),
),
'controllers' => array(
    'factories' => array(
        'Chat\Controller\ChatController' => 'Chat\Factory\ChatControllerFactory'
    ),
),

剩下的是你的控制器工厂:

代码语言:javascript
复制
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控制器创建一个工厂,注入聊天服务,您就完成了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24484716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档