php - Zend Framework 2 getControllerConfig 与 getConfig

标签 php zend-framework2

我正在这里听这个演讲:https://www.youtube.com/watch?v=Vp7y65rnN98

44:00 Module.php::getConfig()Module.php::getControllerConfig()

查看 ZFCampuses zf-apigility-admin 模块等示例模块...

我看到 config/module.config.phpModule.php::getControllerConfig() 都定义了 Controller 工厂。

zf-apigility/config/module.config.php

'controllers' => array(
    'aliases' => array(
        'ZF\Apigility\Admin\Controller\HttpBasicAuthentication' => 'ZF\Apigility\Admin\Controller\Authentication',
        'ZF\Apigility\Admin\Controller\HttpDigestAuthentication' => 'ZF\Apigility\Admin\Controller\Authentication',
        'ZF\Apigility\Admin\Controller\OAuth2Authentication' => 'ZF\Apigility\Admin\Controller\Authentication',
    ),
    'invokables' => array(
        'ZF\Apigility\Admin\Controller\App' => 'ZF\Apigility\Admin\Controller\AppController',
        'ZF\Apigility\Admin\Controller\CacheEnabled' => 'ZF\Apigility\Admin\Controller\CacheEnabledController',
        'ZF\Apigility\Admin\Controller\FsPermissions' => 'ZF\Apigility\Admin\Controller\FsPermissionsController',
    ),
    'factories' => array(
        'ZF\Apigility\Admin\Controller\Documentation' => 'ZF\Apigility\Admin\Controller\DocumentationControllerFactory',
        'ZF\Apigility\Admin\Controller\Filters' => 'ZF\Apigility\Admin\Controller\FiltersControllerFactory',
        'ZF\Apigility\Admin\Controller\Hydrators' => 'ZF\Apigility\Admin\Controller\HydratorsControllerFactory',
        'ZF\Apigility\Admin\Controller\Validators' => 'ZF\Apigility\Admin\Controller\ValidatorsControllerFactory',
        'ZF\Apigility\Admin\Controller\InputFilter' => 'ZF\Apigility\Admin\Controller\InputFilterControllerFactory',
    ),
),

zf-apigility/Module.php

 public function getControllerConfig()
    {
        return array('factories' => array(
            'ZF\Apigility\Admin\Controller\Authentication' => function ($controllers) {
                $services = $controllers->getServiceLocator();
                $model    = $services->get('ZF\Apigility\Admin\Model\AuthenticationModel');
                return new Controller\AuthenticationController($model);
            },
            'ZF\Apigility\Admin\Controller\Authorization' => function ($controllers) {
                $services = $controllers->getServiceLocator();
                $factory  = $services->get('ZF\Apigility\Admin\Model\AuthorizationModelFactory');
                return new Controller\AuthorizationController($factory);
            },
            'ZF\Apigility\Admin\Controller\Config' => function ($controllers) {
                $services = $controllers->getServiceLocator();
                return new Controller\ConfigController($services->get('ZF\Configuration\ConfigResource'));
            },
            'ZF\Apigility\Admin\Controller\ModuleConfig' => function ($controllers) {
                $services = $controllers->getServiceLocator();
                return new Controller\ModuleConfigController($services->get('ZF\Configuration\ConfigResourceFactory'));
            },
            'ZF\Apigility\Admin\Controller\ModuleCreation' => function ($controllers) {
                $services = $controllers->getServiceLocator();
                $model    = $services->get('ZF\Apigility\Admin\Model\ModuleModel');
                return new Controller\ModuleCreationController($model);
            },
            'ZF\Apigility\Admin\Controller\Source' => function ($controllers) {
                $services = $controllers->getServiceLocator();
                $model    = $services->get('ZF\Apigility\Admin\Model\ModuleModel');
                return new Controller\SourceController($model);
            },
            'ZF\Apigility\Admin\Controller\Versioning' => function ($controllers) {
                $services = $controllers->getServiceLocator();
                $factory  = $services->get('ZF\Apigility\Admin\Model\VersioningModelFactory');
                return new Controller\VersioningController($factory);
            },
        ));
    }

我的问题是,为什么这里会发生这种情况?使用 Module.php::getControllerConfig() 与仅在 Module.config.php 中列出工厂相比,我缺少什么?

编辑:我想我在这里找到了问题的答案 https://stackoverflow.com/a/22374072/389976

最佳答案

您将看到 Module.php 中定义的所有工厂都使用闭包(也称为匿名函数)。约定是所有配置都进入 module.config.php 除了闭包之外。

ZF 具有内置功能(默认情况下禁用)来缓存合并的配置文件,但如果配置文件包含闭包,则它无法执行此操作,因为它们无法序列化,因此不可缓存。通过将它们分开,您可以启用配置缓存,从而提高性能。

编辑:也许我们在这里谈论的目的有点矛盾。我上面的回答希望解释为什么 Module.php 中的闭包不应移动到模块配置文件中。您当然可以为每个定义的闭包创建工厂,然后在模块配置中列出它们。有些人会认为这是最佳实践(我个人很少这样做)。此时,需要在开发简易性和性能之间进行权衡。创建一个四行闭包比创建一个全新的类要方便得多。

关于php - Zend Framework 2 getControllerConfig 与 getConfig,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23416012/

相关文章:

rest - 基于 ZF2 REST 的身份验证

php - React/ZMQ/Ratchet - Websocket 服务器响应

php - pdo 准备好的声明不起作用

php - 如何在 php 中添加密码以 curl ?

php - rwd-table 字体在移动设备中不可见

php - 如何从 CodeIgniter 的 View 中替换制表符和新行?

php - 使用 PHPUnit 和 ZF2 工厂

javascript - Ajax 调用不会触发 Zend 2 EVENT_DISPATCH 事件

php - Doctrine 2 迁移工作流程

php - Zend Framework 2 返回对象作为查询结果