Внедрение зависимостей в Zend Framework 2

На самом деле, в моем проекте ZF2 я создал базовые классы для моделей, форм и так далее. Например: я заметил, что мне, вероятно, понадобится ServiceLocator в моих моделях, поэтому я создал класс Application\Model\Base, который реализует ServiceLocatorAwareInterface. Это касается и моих форм.

Я думал, был ли это лучший способ сделать это или мне следует передать зависимости в конструкторе. Итак, сегодня я пришел с проблемой:

У меня есть форма (Application\Form\Customer\Add), которая должна использовать ServiceLocator в своем конструкторе. Но в этот момент ServiceLocator еще не установлен (конструктор вызывается перед setServiceLocator()).

Итак, что вы думаете, это лучший способ решить эту проблему? Должен ли я передавать зависимости конструктором или продолжать использовать тот подход, который я фактически использую (и попытаться решить проблему с формой клиента другим способом)?


person rafaame    schedule 16.12.2013    source источник
comment
Я думаю, что лучше передать ServiceManager конструктору модели в Module.php и передать ServiceManager конструктору формы в контроллере, когда вы получите экземпляр из класса формы.   -  person Mohammad Mehdi Habibi    schedule 17.12.2013


Ответы (1)


Я думаю, что лучше создать фабрику для вашей формы и внедрить только необходимые зависимости из локатора сервисов, а не всего локатора сервисов.

Пример этой фабрики с гидратором:

namespace Application\Form;

use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class AddFormFactory implements FactoryInterface
{
    /**
     * @param ServiceLocatorInterface $serviceLocator
     * @return AddForm
     */
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        // assumes hydrator is already registered in service locator
        $form = new AddForm(
            $serviceLocator->get('MyAddFormHydrator')
        );

        return $form;
    }
}

Пример вашей AddForm:

namespace Application\Form;

use Zend\Form\Form;
use Zend\Stdlib\Hydrator\HydratorInterface;

class AddForm extends Form
{
    public function __construct(HydratorInterface $hydrator, $name = null, $options = [])
    {
        parent::__construct($name, $options);

        // your custom logic here
    }
}

И, наконец, вы должны добавить это в конфигурацию вашего сервис-менеджера:

'service_manager'  => [
    'factories' => [
        'Application\Form\AddForm' => 'Application\Form\AddFormFactory',
    ],
],
person lku    schedule 17.12.2013