php - 使用插件覆盖 ControllerTask
问题描述
当我烘焙控制器时,我想在模型的模板文件夹中生成一个额外的视图文件。我已经复制(尚未更改)ControllerTask.php
到plugins/WetKit/src/Shell/Task
我的插件中。
例如,对于模型条目,我希望在烘焙过程中出现一个新文件:src/Templates/Entries/my_custom_file.ctp
.
但是,当我运行时cake bake controller entries -t WetKit
,我得到:
$ bin/cake bake controller entries -t WetKit
PHP Fatal error: Cannot declare class Bake\Shell\Task\ControllerTask, because the name is already in use in C:\Users\me\Downloads\xampp3\xampp\htdocs\twofk\plugins\WetKit\src\Shell\Task\ControllerTask.php on line 28
实现这一目标的最佳方法是什么?
编辑 1:这会是命名空间问题吗?
编辑2:
对 的编辑WetKitControllerTask.php
保持原样,但添加了“哟!” 在sprintf
函数的输出中:
namespace Wetkit\Bake\Shell\Task;
use Cake\Console\Shell;
use Cake\Core\Configure;
use Cake\ORM\TableRegistry;
use Bake\Shell\Task\ControllerTask;
/**
* Task class for creating and updating controller files.
*
* @property \Bake\Shell\Task\ModelTask $Model
* @property \Bake\Shell\Task\BakeTemplateTask $BakeTemplate
* @property \Bake\Shell\Task\TestTask $Test
*/
class WetKitControllerTask extends ControllerTask
...
public function bake($controllerName)
{
$this->out("\n" . sprintf('Yo! Baking controller class for %s...', $controllerName), 1, Shell::QUIET);
当我运行 bake 命令时,我似乎没有听到“哟!” 出现:
$ bin/cake bake controller entries -t WetKit
Baking controller class for Entries...
编辑 3
我收到一个错误:
- 文件:
plugins/WetKit/src/Shell/Task/WetKitControllerTask.php
- 班级名称:
ControllerTask
- 结果:
Cannot declare class Wetkit\Bake\Shell\Task\ControllerTask because the name is already in use
我收到一个错误:
- 文件:
plugins/WetKit/src/Shell/Task/ControllerTask.php
- 班级名称:
ControllerTask
- 结果:
Cannot declare class Wetkit\Bake\Shell\Task\ControllerTask because the name is already in use
没有错误,但不输出所需的行:
- 文件:
plugins/WetKit/src/Shell/Task/ControllerTask.php
- 班级名称:
WetKitControllerTask
- 结果:没有问题,但也没有显示添加的输出命令
命令
public function bake($controllerName)
{
$this->out("\n" . 'Override damn you!');
在 中的Include
选项卡下DebugKit
,我看到我的WetKit
插件已加载。
为了确认,覆盖应该发生在plugins/WetKit/src/Shell/Task/
插件中?
编辑 4
命名空间问题是我的错。我在尝试覆盖任务时介绍了这一点。
在自动加载器方面,在composer.json
:
"autoload": {
"psr-4": {
"WetKit\\": "src/"
}
},
和:
- 命名空间:
WetKit\Shell\Task
- 文件名:
ControllerTask.php
- 班级名称:
WetKitControllerTask
我决定刷新自动加载文件:
$ composer dump-autoload -o
Generating optimized autoload files
Class WetKit\Shell\Task\WetKitControllerTask located in C:/Users/me/Downloads/xampp3/xampp/htdocs/twofk/plugins/WetKit/src\Shell\Task\ControllerTask.php does not comply with psr-4 autoloading standard. Skipping.
Generated optimized autoload files containing 3261 classes
如果我更改文件名以匹配类名,composer 将加载类而不输出 PSR-4 问题。烘烤仍然不起作用,我没有看到班级变化。
我尝试使用文件名ControllerTask.php
和类名进行烘焙WetKitControllerTask
。Composer 会跳过该文件,但烘焙仍然没有显示我的类修改。奇怪的。
编辑 5
注意到对定位TemplateTask.php
而不是 的更改ControllerTask.php
。我需要做的更适合TemplateTask.php
.
通过类和文件名匹配,我无法烘烤,因为我得到下面显示的错误(这也发生在ControllerTask.php
):
编辑 6
解决方案:
...
use Bake\Shell\Task\TemplateTask as WetKitTemplateTask;
...
class TemplateTask extends WetKitTemplateTask
解决方案
我只需要更改命名空间和类定义,并将文件放在plugin/WetKit/src/Shell/Task
.
...
use Bake\Shell\Task\TemplateTask as WetKitTemplateTask;
...
class TemplateTask extends WetKitTemplateTask
推荐阅读
- sql - 在带参数的过程中插入语句
- postgresql - 无法使用 Spring Boot 连接 Postgres 数据库
- javascript - 如何对嵌套的obj javascript进行排序
- powershell - 搜索文件和文件夹,包括隐藏
- javascript - Powershell Import-Csv 试图将 CSV 文件转换为 HTML,但我不知道如何将 ID 参数添加到表中(需要 jscript)
- sql - SQL 仅选择单行号 x
- mysql - Mysql逗号分隔到json-array
- python - 使用 boto3 获取新创建的 amazon ec2 实例的公共 IPv4 地址
- git - 如何使用 Git 撤消推送的合并?
- asp.net - 使用 SQL Server 和 Azure AD SSO 进行身份验证的 ASP.NET MVC 标识