ZF2: эквивалент getServiceLocator в форме Zend

предположение: Event\Service\EventService – мой личный объект, который работает с объектами Event\Entity\Event

Этот код работает в ActionController:

 $eventService = $this->getServiceLocator()->get('Event\Service\EventService'); 

Как я могу получить $eventService в форме Zend\Form\Form же?

У вас есть два варианта, если у вас такая зависимость. В вашем случае Form зависит от Service . Первый вариант заключается в том, чтобы вводить зависимости :

 class Form { protected $service; public function setService(Service $service) { $this->service = $service; } } $form = new Form; $form->setService($service); 

В этом случае $form не знает о местонахождении $service и обычно считается хорошей идеей. Чтобы убедиться, что вам не нужно настраивать все зависимости самостоятельно каждый раз, когда вам нужна Form , вы можете использовать диспетчер служб для создания фабрики.

Один из способов (есть больше) для создания фабрики – добавить метод getServiceConfiguration() в свой класс модуля и использовать закрытие для создания экземпляра объекта Form . Это пример внедрения Service в Form :

 public function getServiceConfiguration() { return array( 'factories' => array( 'Event\Form\Event' => function ($sm) { $service = $sm->get('Event\Service\EventService'); $form = new Form; $form->setService($service); return $form; } ) ); } 

Затем вы просто получаете Form у своего менеджера обслуживания. Например, в вашем контроллере:

 $form = $this->getServiceLocator()->get('Event\Form\Event'); 

Второй вариант – вытягивать зависимости . Хотя это не рекомендуется для классов, таких как формы, вы можете ввести менеджера сервисов, чтобы форма могла самостоятельно вытягивать зависимости:

 class Form { protected $sm; public function setServiceManager(ServiceManager $sm) { $this->sm = $sm; } /** * This returns the Service you depend on * * @return Service */ public function getService () { return $this->sm->get('Event\Service\EventService'); } } 

Однако этот второй вариант связывает ваш код с ненужными связями, и это очень сложно проверить ваш код. Поэтому, пожалуйста, используйте инъекцию зависимостей, а не вытягивайте зависимости самостоятельно. Есть только несколько случаев, когда вы, возможно, захотите самостоятельно вытащить зависимости:

Вы можете просто настроить форму со всеми параметрами в module.php. В следующем коде I:

  • Назовите службу my_form
  • Свяжите новый объект \ MyModule \ Form \ MyForm с этой службой
  • Внесите службу «something1» в _construct ()
  • Внесите службу «something2» в setSomething ()

Код:

 public function getServiceConfiguration() { return array( 'factories' => array( 'my_form' => function ($sm) { $model = new \MyModule\Form\MyForm($sm->get('something1')); $obj = $sm->get('something2'); $model->setSomething($obj); return $model; }, ), ); } 

А затем в контроллере следующая строка заполнит ваш объект всеми необходимыми зависимостями

$form = $this->getServiceLocator()->get('my_form');

Используйте диспетчер элементов формы, чтобы получить форму в контроллере:

  $form = $this->getServiceLocator()->get('FormElementManager')->get('Path\To\Your\Form', $args); 

Тогда в вашей форме это станет

 <?php namespace Your\Namespace; use Zend\Form\Form; use Zend\ServiceManager\ServiceLocatorAwareInterface; use Zend\ServiceManager\ ServiceLocatorAwareTrait; class MyForm extends Form implements ServiceLocatorAwareInterface { use ServiceLocatorAwareTrait; public function __construct($class_name, $args) { /// you cannot get the service locator in construct. } public function init() { $this->getServiceLocator()->get('Path\To\Your\Service'); } }