简而言之,我的问题是:我可以为多个控制器使用一个工厂吗?
更多细节:
我在/config/autoload/global.php中有一些全局非模块特定设置,如下所示:
return array(
'settings' => array(
'setting_a' => 'foo',
'setting_b' => 'bar'
),
// More ZF default configuration ...
);
现在我想让这些设置在每个控制器中都可以访问,而不必一直调用$this->getServiceLocator()->get('config')
。
$settings
所以我的想法是在我AbstractController
的配置数组中引入一个类属性。我试图直接在AbstractController
. 但是getServiceLocator()
,当时似乎还没有准备好并返回 NULL。
我可以为每个控制器构建控制器工厂并注入如下设置:
class ControllerFactory implements FactoryInterface
{
public function createService(ServiceLocatorInterface $serviceLocator) {
$config = $serviceLocator->get('config');
return new \MyModule\Controller\MyController($config['settings']);
}
}
但它会一遍又一遍地相同。所以我的问题是:我可以为多个控制器使用一个工厂吗?
在我的module.config.php 中,我可以为多个控制器指定一个工厂类:
return array(
'controllers' => array(
'factories' => array(
'MyModule\Controller\MyControllerA' => 'MyModule\Factory\ControllerFactory',
'MyModule\Controller\MyControllerB' => 'MyModule\Factory\ControllerFactory',
'MyModule\Controller\MyControllerC' => 'MyModule\Factory\ControllerFactory',
)
),
);
但是在工厂中,我需要手动返回实际的 Controller 对象(参见上面的示例),这当然只适用于每个 Controller 的一个工厂。
希望,我把我的问题说清楚了。
2013 年 3 月 24 日更新:
尽管我首先通过创建一个初始化程序来遵循建议的解决方案,但我从来没有真正喜欢将它仅用于配置注入。
所以我一直在挖掘并最终创建了一个控制器插件来接收设置。
该插件的代码如下所示:
use Zend\Mvc\Controller\Plugin\AbstractPlugin;
class Settings extends AbstractPlugin
{
protected $settings;
public function __invoke()
{
$config = $this->getController()->getServiceLocator()->get('Config');
if (isset($config['settings']) && is_array($config['settings'])) {
$this->settings = $config['settings'];
}
return $this->settings;
}
}
在module.config.php中添加插件后
'controller_plugins' => array(
'invokables' => array(
'settings' => 'My\Controller\Plugin\Settings',
)
),
我可以通过简单地调用在控制器中轻松访问我的设置$this->settings()
。希望这对任何人都有帮助。