我刚刚开始使用 zend 框架 2。我创建了一个用户表单并在我的控制器中使用该表单我可以在我的控制器中包含 from 类并使用 new 创建和对象,或者我可以使用服务访问表单管理器配置以访问表单。
我在这里寻找使用服务管理器而不是直接实例化对象的原因。有任何想法吗??
我刚刚开始使用 zend 框架 2。我创建了一个用户表单并在我的控制器中使用该表单我可以在我的控制器中包含 from 类并使用 new 创建和对象,或者我可以使用服务访问表单管理器配置以访问表单。
我在这里寻找使用服务管理器而不是直接实例化对象的原因。有任何想法吗??
服务管理器的想法是您可以在运行时替换表单。这完全是关于解耦和可重用性。
假设您有一个模块Foo
并且有一个表单Foo\Form\Something
。然后你把Foo
模块放在另一个应用程序中,但你需要将表单切换为其他东西。如果您只是$form = new Foo\Form\Something
在控制器中执行此操作,则没有简单的选项来实例化另一个表单。如果您在 下注册表单foo_form_something
,则该Bar
模块可以覆盖该服务。所以foo_form_something
不加载Foo\Form\Something
但是Bar\Form\Something
。控制器无需更改。
还有另一种相关的编码风格,您可以在控制器中注入表单,而不是通过服务管理器拉取它。你可能会使用这个:
namespace MyModule\Controller;
class MyController
{
public function myAction()
{
$form = $this->getServiceLocator()->get('foo_form_something');
}
}
但这会使您的控制器的测试变得更加困难。注入依赖更容易:
namespace MyModule\Controller;
use Foo\Form\Something as SomethingForm;
class MyController
{
protected $form;
public function __construct(SomethingForm $foo)
{
$this->form = $foo
}
public function myAction()
{
$form = $this->form;
}
}
然后在控制器配置中注入表单:
namespace MyModule;
class Module
{
public function getControllerConfig()
{
return array(
'factories' => array(
'MyModule\Controller\MyController' => function($sm) {
$form = $sm->getServiceLocator()->get('foo_form_something');
$controller = new MyModule\Controller\MyController($form);
return $controller;
}
),
);
}
}