2013-12-13 3 views
2

Существует не менее трех методов: Zend\Di, ConfigAwareInterface и ControllerFactory - Я рассмотрел возможность ввода конфигурации в контроллеры.ZF2: Конфигурация, специфичная для инъекций, в контроллер

В more or less official recommendation is the ControllerFactory, что приводит к этому коду (или this code if you prefer closures - у меня нет, так как они тяжелее, чтобы проверить):

// module.config.php 
'controllers' => array (
    'factories' => array (
     'Module\Concept\Index' => 'Concept\ControllerFactory\IndexControllerFactory', 
    ), 
), 
'some_config_key' => array (
    'x' => 'foo' 
), 

// src/Concept/ControllerFactory/IndexControllerFactory.php 
class IndexControllerFactory implements FactoryInterface { 
    public function createService(ServiceLocatorInterface $serviceLocator) { 
     $config = $serviceLocator->getServiceLocator()->get('config'); 
     $controller = new \Html\Controller\IndexController($config['some_config_key']); 
     return $controller; 
    } 
} 

// src/Concept/Controller/IndexController.php 
class IndexController { 
    public function __construct($config) { 
     // here we go, yay! we have $config['x'] == 'foo' 
    } 
} 

Если каждое действие нуждается в различной конфигурации (например, один, возможно, потребуется DB, другому может потребоваться PayPal), не представляется правильным пройти все Конфигурация контроллера, когда только его необходимо для действия.

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

Update
зависимостей для каждого действия только что: специфичны. Контроллер объявляет, что ему нужно, а затем использует это, каким бы то ни было образом. Эти два действия имеют радикально разные потребности, что, возможно, контроллер имеет слишком широкий охват и может быть кандидатом на разделение.

Но, несмотря на это, лучший способ - то, что было ясным, надежным и, по-видимому, в соответствии с будущим направлением ZF, - это производство необходимых услуг на сервисной фабрике, а затем изготовление контроллера с необходимыми услугами ,

Два завода: обслуживание и контроллер. Контроллер объявляет свой контракт __construct с услугами, которые он должен иметь, а затем фабрики производят их по мере необходимости из конфигурации модуля.

ответ

1

Этот вопрос в основном основан на мнениях, поэтому вы можете получить много разных ответов.

Этих два подхода хорош, так как:

  • Как вы знаете, что мы видим много в ZF2 является менеджером службы все вокруг, со всей объединенной конфигурацией беготни всех приложений. Поэтому, даже если это не лучший подход, он широко используется.
  • Если мы имеем в виду принцип инверсии зависимостей (что у нас есть), а также принципы high cohesion и low coupling, которые говорят нам, что изоляция хороша, что все компоненты не должны знать два о других , и что все внутри модуля должно быть сильно связано, мы можем думать, что имея всю объединенную конфигурацию в каждом контроллере и даже пусть контроллер знает, какой ключ в объединенном объединенном массиве конфигурации содержит свою конфигурацию, вероятно, это не лучшая вещь, и, вероятно, то, что должен получить модуль, - это его конфигурация, независимо от того, происходит ли она из большего массива, с завода, из ада или из другого места, поскольку на самом деле ему не нужно это знать, и это не делает Не важно.

Так что, вероятно, лучший подход заключается в том, чтобы вводить только ту конфигурацию, которую она ожидает. Фактически, это то, что мы используем для создания ViewHelper, где обычно мы не вводим все, кроме только того, что нам нужно.

Это может сбить с толку, поскольку иногда вам может понадобиться и другая общая конфигурация, а не только конфигурация, исключительно связанная с модулем, и в этом случае вам придется подумать об этом. Но в большинстве случаев более элегантным решением, вероятно, будет введение именно то, что вам нужно.

В качестве еще и важный аргумент, я прочитал в sam minds blog что

... Есть еще несколько вещей, которые просто не идеальны. Небольшим примером было бы то, что многие люди используют $ this-> getServiceLocator() внутри своих контроллеров. Хотя это нормально, это на самом деле считается плохой практикой. То, как выглядят вещи , теперь эта функция будет удалена в Zend Framework 3 (ZF3) до , в основном заставляя людей использовать надлежащую инъекцию зависимостей, используя ServiceManager .

, так что мы можем думать, что правильный подход заключается в том, чтобы принести инъекцию зависимостей, насколько мы можем, и позволить каждому компоненту знать как можно меньше.

+0

«возможно, лучший подход заключается в том, чтобы вводить только ту конфигурацию, которую он ожидает». Согласовано. Обновил мой вопрос по пути, который я выбрал (контроллеры и сервисные заводы). – bishop

Смежные вопросы