Автоматически вводить ресурсы в контроллер - PullRequest
3 голосов
/ 04 августа 2011

Я пытаюсь внедрить внедрение зависимостей в наш проект Zend Framework.

В предыдущих проектах на основе APS.NET мы использовали StructureMap и перезаписывали DefaultControllerFactory для внедрения зависимостей в контроллеры.

Я не уверен, где делать инъекции в Zend Framework? Я изучил Zend_Controller_Plugin_Abstract и Zend_Controller_Action_Helper_Abstract, но, похоже, ни один из них не позволяет мне вводить данные в текущий экземпляр контроллера.

Мне бы хотелось иметь возможность внедрять в конструктор текущего контроллера, как я это делаю в ASP.NET, но сеттеры приемлемы (я думаю).

Есть идеи о том, как сделать это или что-то подобное?

В конечном счете, я бы хотел сделать что-то вроде этого:

MyController extends Zend_Controller_Action {
  // private vars
  [...]

  public function __constructor($authenticationService, $userRepository) {
    $this->_authServ = $authenticationService;
    $this->_userRepo = $userRepository;
  }    

}

Я хотел бы сделать что-то вроде того, что я делаю для stuctureMap:

For(authenticationService).Use(WhatEverClass);

или, может быть:

$currentController->authServ = $authenticationService;
$currentController->userRepo = $userRepository;

Вкратце: где мы можем перехватить создание (или получить экземпляр) текущего контроллера?

Аналогичный (без ответа) вопрос здесь

Спасибо! / Jon

Ответы [ 2 ]

4 голосов
/ 04 августа 2011

Ведущий разработчик Zend Framework Мэтью Вейер О'Пинни (Matthew Weier O'Phinney) имеет пост, в котором, похоже, рассматривается идея внедрения ресурсов в контроллеры:

Простой инжектор ресурсов для контроллеров действий ZF

1 голос
/ 04 декабря 2012

Проверьте также PHP-DI , это библиотека внедрения зависимостей, которая интегрируется с Zend Framework.Он работает с аннотациями.

Это позволяет вам делать такие вещи, как:

MyController extends Zend_Controller_Action {
    /**
     * @Inject
     * @var MyService
     */
    private $myService;

    public function helloAction() {
        return $this->myService->sayHello();
    }
}
...