Идея менеджера сервиса заключается в том, что вы можете заменить форму во время выполнения. Все дело в развязке и повторном использовании.
Предположим, у вас есть модуль 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;
}
),
);
}
}
Вы можете попытаться сделать ваш вопрос более ясным? Я вообще этого не понимаю. Правильное написание и грамматика могут помочь :( – Sam