Php 呼叫服务,zf2项目中任何地方的工厂

Php 呼叫服务,zf2项目中任何地方的工厂,php,zend-framework2,zfcuser,Php,Zend Framework2,Zfcuser,我是zend框架的新手。我担心如何调用服务,而不是从控制器(或未扩展的类)调用工厂 我正在使用ZfcUser模块对用户进行身份验证。现在我想检查是否有用户登录到ZfcUser\Form\Base类中。我无法调用ZfcUser\Module中getControllerPluginConfig()中的zfcUserAuthentication工厂 请找个人来帮我 谢谢您需要注入给定服务/类所依赖的服务/类。在您的情况下,您应该修改ZfcUser\Form\Base以通过构造函数或setter函数接受

我是zend框架的新手。我担心如何调用服务,而不是从控制器(或未扩展的类)调用工厂

我正在使用ZfcUser模块对用户进行身份验证。现在我想检查是否有用户登录到ZfcUser\Form\Base类中。我无法调用ZfcUser\Module中getControllerPluginConfig()中的zfcUserAuthentication工厂

请找个人来帮我


谢谢

您需要注入给定服务/类所依赖的服务/类。在您的情况下,您应该修改
ZfcUser\Form\Base
以通过构造函数或setter函数接受类。然后,您将修改创建
ZfcUser\Form\Base
实例的服务工厂,以注入依赖项

例如:

ZfcUser\Form\Base

private $myDependency;

public function setMyDependency($dependency) {
    $this->myDependency = $dependency;
}
如果您在服务工厂配置中使用闭包,例如:

'my_service_that_uses_zfcuser_form_base' => function($sm) {
    $form = new ZfcUser\Form\Base();
    $form->setMyDependency($sm->get('the_dependency_you_want'));
    return $form;
}

避免注入服务管理器,这是一种糟糕的做法。

您需要注入给定服务/类所依赖的服务/类。在您的情况下,您应该修改
ZfcUser\Form\Base
以通过构造函数或setter函数接受类。然后,您将修改创建
ZfcUser\Form\Base
实例的服务工厂,以注入依赖项

例如:

ZfcUser\Form\Base

private $myDependency;

public function setMyDependency($dependency) {
    $this->myDependency = $dependency;
}
如果您在服务工厂配置中使用闭包,例如:

'my_service_that_uses_zfcuser_form_base' => function($sm) {
    $form = new ZfcUser\Form\Base();
    $form->setMyDependency($sm->get('the_dependency_you_want'));
    return $form;
}

避免注入服务管理器,这是不好的做法。

您看到的是服务管理器的概念。基本上,您需要确保您创建的服务能够访问它们所需的网关或服务

例如,如果您有一个服务负责将实体(DataObjects)持久化到数据库,那么您需要确保将数据库适配器“注入”到ServiceObject中

因此,应通过构造函数注入设置所需的依赖项,即:

class MyService {
    public function __construct(DbAdapter $dbA) {
        // do stuff with $dbA
    }
}
您可以通过ServiceManager来创建它

'service_manager' => array(
    'factories' => array(
        'MyService' => function($sm) {
             $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
             $service   = new MyService($dbAdapter);
             return $service;
         }
    )
)
最后,您可以通过ServiceManager(可能在控制器中的某个位置)访问您的服务


你所看到的是一个概念。基本上,您需要确保您创建的服务能够访问它们所需的网关或服务

例如,如果您有一个服务负责将实体(DataObjects)持久化到数据库,那么您需要确保将数据库适配器“注入”到ServiceObject中

因此,应通过构造函数注入设置所需的依赖项,即:

class MyService {
    public function __construct(DbAdapter $dbA) {
        // do stuff with $dbA
    }
}
您可以通过ServiceManager来创建它

'service_manager' => array(
    'factories' => array(
        'MyService' => function($sm) {
             $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
             $service   = new MyService($dbAdapter);
             return $service;
         }
    )
)
最后,您可以通过ServiceManager(可能在控制器中的某个位置)访问您的服务


谢谢@Sam。我知道了。但是我们如何在构造函数中调用服务。当我尝试时,我犯了致命的错误。你能在这方面提供帮助吗?@ManikThakur请打开一个新的问题。注入发生在构造函数中,一旦正确注入,您就可以访问它。请确保将错误粘贴到您自己的线程中。@Sam我刚才问这个问题是因为这个线程的标题。“任何地方都意味着它也可以在构造函数中。”ManikThakur我的观点是:我不知道你的问题是什么。5年前的帖子中的评论部分不是寻求帮助的地方;)谢谢@Sam。我知道了。但是我们如何在构造函数中调用服务。当我尝试时,我犯了致命的错误。你能在这方面提供帮助吗?@ManikThakur请打开一个新的问题。注入发生在构造函数中,一旦正确注入,您就可以访问它。请确保将错误粘贴到您自己的线程中。@Sam我刚才问这个问题是因为这个线程的标题。“任何地方都意味着它也可以在构造函数中。”ManikThakur我的观点是:我不知道你的问题是什么。5年前的帖子中的评论部分不是寻求帮助的地方;)