【发布时间】:2014-01-01 19:28:52
【问题描述】:
至少有三种方法——Zend\Di、ConfigAwareInterface 和ControllerFactory——我考虑过将配置注入控制器。
导致此代码的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),当只有 一些 时传递 all 控制器配置似乎不合适> 行动所需要的。
那么,哪些操作需要哪些配置的知识应该进入工厂还是控制器?也就是说,工厂应该根据手头的动作只给控制器它需要的东西,还是应该给控制器所有的配置并在内部弄清楚?
更新
特定于操作的依赖关系就是:特定的。控制器声明它需要什么,然后以任何必要的方式使用它。这两个动作的需求完全不同,这表明控制器的范围可能过于宽泛,并且可能是分离的候选者。
但无论如何,最好的方式——清晰、稳健且显然符合 ZF 未来方向的方式——是在服务工厂制造所需的服务,然后制造具有必要服务的控制器。
两个工厂:服务和控制器。控制器用它必须拥有的服务声明其__construct 合同,然后工厂根据模块配置根据需要制造这些服务。
【问题讨论】:
标签: php configuration zend-framework2 config