Идея диспетчера служб заключается в том, что у вас есть возможность заменить форму во время выполнения. Все дело в разделении и повторном использовании.
Допустим, у вас есть модуль 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;
}
),
);
}
}
person
Jurian Sluiman
schedule
09.02.2013