ozee31/cakephp-override

轻松覆盖 CakePHP 的插件类和模板

安装: 48

依赖项: 0

建议者: 0

安全性: 0

星标: 3

关注者: 2

分支: 0

开放问题: 0

类型:cakephp-plugin

v1.0.0 2018-07-06 13:19 UTC

This package is not auto-updated.

Last update: 2024-09-22 08:58:07 UTC


README

需求

  • PHP 版本 5.6 或更高
  • CakePhp 3.4 或更高

安装

您可以使用 composer 将此插件安装到您的 CakePHP 应用程序中。

安装 composer 包的推荐方法是

composer require ozee31/cakephp-override

config/bootstrap.php 中加载插件

Plugin::load('Override', ['bootstrap' => true]);

配置

  • 创建配置文件 config/overrides.php,并包含以下代码
<?php return ['Overrides' => [
    'routes' => [
        /*
         * (!) You must also add the model override
         */
    ],
    'models' => [
        /*
         * (!) Always redeclare entityClass when overriding className otherwise cakephp does not use it
         */
    ],
    'helpers' => []
]];
  • 将此代码添加到您的 config/routes.php 文件中,并将 Plugin::routes() 移至文件末尾
<?php
// Use Override class
use Override\Routing\Override;


Router::scope('/', function (RouteBuilder $routes) {
    // In Router scope add this code
    Override::connect($routes);

    // ... other routes
});

// Plugin routes must be declared after Override::connect()
Plugin::routes();
  • 在您的 AppController 中加载 Override 组件
public function initialize()
{
    parent::initialize();

    $this->loadComponent('Override.Override');
}

示例

路由

在我的示例中,我将覆盖 Croogo 插件,但它适用于任何插件

如果您想重写此路由

$routes->connect(
    '/user/:username', 
    ['controller' => 'Users', 'action' => 'view'],
    ['pass' => ['username']]
);

您必须在 config/overrides.php 中添加以下内容

'routes' => [
    '/user/:username' => [
        'route' => ['controller' => 'Users', 'action' => 'view', 'plugin' => false],
        'options' => ['pass' => ['username']]
    ],
],

模板

模板覆盖是 Cakephp 的原生功能

如果您想重写 MyPluginUsers/index.ctp 模板,您只需在项目中创建以下文件:src/Template/Plugin/MyPlugin/Users/index.ctp (src/Template/Plugin/PluginName/ControllerName/ActionName.ctp)

Croogo 使用子插件,如果您想重写 Croogo.Users 插件的 Users/view.ctp 模板,您只需在项目中创建以下文件:src/Template/Plugin/Croogo/Users/Users/view.ctp (src/Template/Plugin/PluginName/SubpluginName/ControllerName/ActionName.ctp)

模型

仅实体

如果您想覆盖 MyPluginUser 实体,您必须在 config/overrides.php 中添加以下代码

'models' => [
    'MyPlugin.Users' => ['entityClass' => 'App\Model\Entity\User'],
],

表和实体

如果您想覆盖 MyPluginUser 实体和 Users 表,您必须在 config/overrides.php 中添加以下代码

'models' => [
    'MyPlugin.Users' => [
        'className' => 'App\Model\Table\UsersTable', 
        'entityClass' => 'App\Model\Entity\User'
    ],
],

仅表

如果您只想覆盖 MyPluginUsers 表,您必须重新声明实体类

'models' => [
    'MyPlugin.Users' => [
        'className' => 'App\Model\Table\UsersTable', 
        'entityClass' => 'MyPlugin\Model\Entity\User'
    ],
],

辅助函数

如果您想覆盖 MyPluginTestsHelper,您必须在 config/overrides.php 中添加以下代码

'helpers' => [
        'MyPlugin.Tests' => [
            'className' => 'Tests', // must be the same name of original
            'controllers' => true, // true if you want override for all Controllers, an array or a string otherwise
        ]
    ]

故障排除

我的模型覆盖不起作用

尝试清除您的缓存(tmp/cache/modelstmp/cache/persistent

当覆盖路由时,插件模型未加载

您必须在 config/overrides.php 中重新声明模型

例如

<?php return ['Overrides' => [
    'routes' => [
        '/myplugin/users' => [
            'route' => ['controller' => 'Users', 'action' => 'index', 'plugin' => false],
        ],
    ],
    'models' => [
        'MyPlugin.Users' => [
            'className' => 'MyPlugin\Model\Table\UsersTable',
            'entityClass' => 'MyPlugin\Model\Entity\User'
        ],
    ],
    'helpers' => []
]];