如何覆盖/克隆模块,这些模块由zf2中的composer下载到供应商?

时间:2014-04-29 19:15:41

标签: php module zend-framework2 override

SO !!!

我在我的项目中添加了zfcUser模块(但我想对其他任何模块执行此操作),基于Zend Framework 2 *。我如何覆盖此模块的控制器/视图/配置,因此不会通过更新与作曲家的依赖关系删除它们的更改(我试图这样做并且没有找到文件被链接,但是如果。 ......哦)

我知道存在这样做的方式,但我不知道。查看助手?或者是什么?

请帮帮我!谢谢。

附加信息

ZfcUserOverride的当前文件夹和文件:

Current folders and files of ZfcUserOverride

2 个答案:

答案 0 :(得分:2)

让我们逐一回答你的所有问题。

但在让我们记住,ModuleManager正在创建"应用程序配置"合并所有已注册模块的所有模块服务配置(默认文件名为每个模块中的config / module.config.php)(从application.config.php开始的模块'键)从第一个到最后一个:这意味着最后的胜利"。

举一个实际的例子,如果你有一个名为" XYZ"的配置键。在模块" A"覆盖模块" B"中的值,模块" B"必须在" A"。

之后注册

假设您要覆盖应用程序模块中的ZfcUser配置,后者必须在前者之后注册。

'modules' => array(
    'ZfcUser',
    'Application',
),

1)如何覆盖视图脚本?

如前所述,您应该创建一个自定义模块(我建议您使用zftool创建新项目和模块脚手架),其中包含views / {module name}文件夹中的覆盖自定义视图脚本(views / zfc-user对于ZfcUser模块)。 给它一个简单的尝试创建模块/ {module-name} /view/zfc-user/user/login.phtml文件,其中包含任何内容,访问/ user / login url:您应该看到被覆盖的视图脚本。< / p>

2)如何覆盖控制器?

控制器已注册为服务,如果您看到ZfcUser模块配置,则可以找到

'controllers' => array(
    'invokables' => array(
        'zfcuser' => 'ZfcUser\Controller\UserController',
    ),
),

&#39; zfcuser&#39; key可以在路由配置中使用

                'defaults' => array(
                    'controller' => 'zfcuser', // this refers to the controller service
                    'action'     => 'index',
                ),

在ZfcUser模块中,用户控制器,路由规则和template_path_stack具有相同的名称,&#39; zfcuser&#39;乍一看,它可能会令人困惑,请记住,它们指的是不同的服务(视图,控制器和路由配置)。

要强制应用程序使用您的自定义控制器而不是ZfcUser的UserController,您只需要覆盖自定义模块中的控制器服务,如下所示(对于此示例,我使用了应用程序模块)

'controllers' => array(
    'invokables' => array(
        'zfcuser' => 'Application\Controller\UserController',
    ),
),

您的应用程序\ Controller \ UserController&#39;可以扩展原始控制器以保持原始功能(可能只需要编辑几种方法)。

3)如何覆盖配置?

如果是&#39; config&#39;您的意思是服务配置只需执行与第2点相同的工作:获取配置键并更改其值。

ZfcUser是一个可配置模块,这意味着可以配置值,任何类型的值,不一定是服务。看一下config / zfcuser.global.php.dist:这个没有.dist后缀重命名的文件可以包含在你的{Application} / config / autoload目录中,框架会自动加载它的内容(将配置模块)。 例如,您可以配置哪些是标识字段,是否使用验证码,登录后路由等等...

我不会在这里解释如何制作一个可配置的模块,有很多关于如何做的教程。

我希望我没有弄错任何错误,并且我已经全面回答了你的问题,如果你有问题只是回复:)

干杯

答案 1 :(得分:1)

执行此操作的最佳方法是创建自己的模块以覆盖要覆盖的所有内容。 视图很简单,只需在子模块用户的模块视图文件夹中添加一个名为zfc-user的子文件夹,即可获得YourModule / view / zfc-user / user 在这个自定义视图文件夹中,您只需添加自己的ZfcUser模板版本:login.phtml,register.phtml等。

为此,请确保在ZfcUser之后加载模块。所以在你的config / application.config.php中,确保Yourmodule位于'modules'数组中的ZfcUser之后。

要覆盖控制器,只需在自己的模块中定义自己的UserController,或者扩展ZfcUsers的UserController或者定义自己的UserController。然后让路由处理剩下的事情。所以在YourModule的module.config.php中创建指向你自己的UserController的路由。

修改 将自定义UserController添加到ZfcUserOverride模块。然后将它添加到同一模块的module.config.php中,并添加到服务管理器配置中,并使用zfcuser将其命名为zfcuser,这是ZfcUser使用的名称。

'controllers' => array(
        'invokables' => array(
            'zfcuser' => 'ZfcUserOverride\Controller\UserController',
        ),            
),

编辑2: 另外不要忘记将它添加到你的module.config.php:

'view_manager' => array(
    'template_path_stack' => array(
        'zfcuser' => __DIR__ . '/../view',
    ),
),

如果您要覆盖ZfcUser的视图脚本,则需要这样做。