在zf2项目的任何地方调用服务,工厂

时间:2013-06-27 11:03:31

标签: php zend-framework2 zfcuser

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

我正在使用 ZfcUser 模块对用户进行身份验证。现在我想检查用户是否记录在ZfcUser \ Form \ Base类中。我无法在 ZfcUser \ Module

中的 getControllerPluginConfig()内调用 zfcUserAuthentication 工厂

请有人帮助我。

谢谢

2 个答案:

答案 0 :(得分:3)

您所关注的是Dependency Injection的概念。基本上,您需要确保您创建的服务可以访问他们需要的网关或服务。

例如,如果您有一个服务,负责将您的实体(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(可能是控制器中的某个位置)访问您的服务。

public function someAction() {
    $service = $this->getServiceLocator()->get('MyService');
    // do stuff with $service
}

答案 1 :(得分:2)

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

例如:

ZfcUser \表格\基

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;
}

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