ozee31 / cakephp-override
轻松覆盖 CakePHP 的插件类和模板
Requires
- cakephp/cakephp: ^3.4
Requires (Dev)
- phpunit/phpunit: ^5.7|^6.0
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 的原生功能
如果您想重写 MyPlugin 的 Users/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)
模型
仅实体
如果您想覆盖 MyPlugin 的 User 实体,您必须在 config/overrides.php 中添加以下代码
'models' => [ 'MyPlugin.Users' => ['entityClass' => 'App\Model\Entity\User'], ],
表和实体
如果您想覆盖 MyPlugin 的 User 实体和 Users 表,您必须在 config/overrides.php 中添加以下代码
'models' => [ 'MyPlugin.Users' => [ 'className' => 'App\Model\Table\UsersTable', 'entityClass' => 'App\Model\Entity\User' ], ],
仅表
如果您只想覆盖 MyPlugin 的 Users 表,您必须重新声明实体类
'models' => [ 'MyPlugin.Users' => [ 'className' => 'App\Model\Table\UsersTable', 'entityClass' => 'MyPlugin\Model\Entity\User' ], ],
辅助函数
如果您想覆盖 MyPlugin 的 TestsHelper,您必须在 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/models 和 tmp/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' => [] ]];