我是zend框架的新手。我担心如何从控制器(或未扩展AbstractActionController的类)调用服务、工厂。
我正在使用ZfcUser模块对用户进行身份验证。现在我想检查 ZfcUser\Form\Base 类中是否有用户登录。我无法调用ZfcUser\Module中getControllerPluginConfig()中的zfcUserAuthentication工厂
请有人帮助我。
谢谢
我是zend框架的新手。我担心如何从控制器(或未扩展AbstractActionController的类)调用服务、工厂。
我正在使用ZfcUser模块对用户进行身份验证。现在我想检查 ZfcUser\Form\Base 类中是否有用户登录。我无法调用ZfcUser\Module中getControllerPluginConfig()中的zfcUserAuthentication工厂
请有人帮助我。
谢谢
您正在查看的是 的概念Dependency Injection
。基本上,您需要确保您创建的服务能够访问他们需要的网关或服务。
例如,如果您有一个服务负责将您的实体(数据对象)持久化到数据库中,那么您需要确保将数据库适配器“注入”到服务对象中。
因此,必需的依赖项应通过构造函数注入设置,即:
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
}
您需要注入给定服务/类所依赖的服务/类。在您的情况下,您应该修改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;
}
避免注入服务管理器,这是不好的做法。