предположение: 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:
Код:
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'); } }