использовать локатор службы для формы или добавить зависимость и создать объект?

я просто получаю доступ к zend framework 2. Я создал пользовательскую форму, и чтобы использовать эту форму в моем контроллере, я могу либо включить класс from в свой контроллер, либо создать объект, используя новый, либо я могу получить доступ к форме с помощью сервиса Конфигурация менеджера для доступа к форме.

я нахожу причины для использования диспетчера служб здесь, а не для прямого создания экземпляра объекта. Любые идеи??


person graphicmist    schedule 08.02.2013    source источник
comment
Можете ли вы попытаться сделать свой вопрос более ясным? Я вообще этого не понимаю. Правильная орфография и грамматика могут помочь :(   -  person Sam    schedule 08.02.2013


Ответы (1)


Идея диспетчера служб заключается в том, что у вас есть возможность заменить форму во время выполнения. Все дело в разделении и повторном использовании.

Допустим, у вас есть модуль 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