Я читаю компонент ZF2 Service Locator и могу сказать, что я понимаю, как он используется. У меня есть, однако, вопрос, который я считаю его глупым, но это не помешает спросить.ZF2 Инъекция зависимостей от объектов контроллера без локатора сервисов
Я хочу иметь пространство имен внутри моего модуля под названием «Компонент», где я могу указать общий код, например, как функцииComponent.php, MailerComponent.php или ExcelComponent.php. Это позволило бы мне сделать некоторые вещи внутри моих контроллеров.
То, что я хотел бы проба должна иметь возможность иметь контроллеры определить компоненты, которые они заинтересованы в использовании (см):
class SalesController extends AbstractController
{
protected $components = ['Excel'];
//In some action
public function exportAction()
{
$data = ['data to be exported'];
/**
$data : data to be exported
boolean : Whether to force download or save the file in a dedicated location
*/
$this->Excel->export($data, true);
}
}
Идея заключается в том, чтобы создать ComponentCollection, что, возможно, реализующий FactoryInterface или ServiceLocatorInterface, а затем дайте ему проверить каждый контроллер, когда MvcEvent была запущена внутри моего класса модуля и имеет ComponentCollection впрыскивать все компоненты контроллера и сделать их доступными без использования локатора сервиса, как показано ниже:
$excel = $sm->get('Application\Component\Excel');
Мне хорошо известно, что это может показаться сложным спросом, но я чувствую, что лучший способ изучить структуру среди прочего - это поиграть с ней и попытаться сделать невообразимое.
Я не совсем уверен, что вы здесь задаете. Самый эффективный способ ввода зависимостей контроллеров - через локатор сервисов (с использованием фабрики). В противном случае альтернативой (контейнер DI) в Zend будет компонент Zend \ Di. Они оба решают одну и ту же проблему. Предпочтение с ZF2 должно использоваться с помощью Locator. – AlexP
Идея состоит в том, чтобы использовать те же инструменты, предоставляемые каркасом, но по-другому вместо того, чтобы получать определенный компонент через локатор сервисов, мы скорее определяем свойство компонентов с массивом компонентов, которые мы хотели бы использовать в нашем контроллере, и как эти компоненты создаются можно сделать в фоновом режиме, когда разработчик может пойти как $ ComponentName-> functionCall ($ parameters) в отличие от $ component = $ sl-> get ('Namespace \ Component \ ActualComponent') каждый раз, когда вы хотите использовать компонент. – Maximum86
Вам следует избегать использования сервис-менеджера * в * ваших сервисах (включая контроллер). «Компоненты», которые вы упомянули, являются зависимостями класса *, то есть их следует вводить в требуемую службу (через локатор сервисов или DI), чтобы затем они были доступны как свойства экземпляра (т. Е. '$ This-> myService').Если вы хотите использовать метод * удобства *, такой как '$ ComponentName-> functionCall ($ parameters)' все, что вам нужно будет сделать, это реализовать волшебный метод '__call()' и определить, соответствует ли запрошенное имя метода определенному класса. – AlexP