2013-02-08 2 views
0

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

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

+0

Вы можете попытаться сделать ваш вопрос более ясным? Я вообще этого не понимаю. Правильное написание и грамматика могут помочь :( – Sam

ответ

0

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

Предположим, у вас есть модуль 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; 
     } 
    ), 
    ); 
    } 
} 
+0

спасибо, что юрист, который очищает мои сомнения – graphicmist