使用插件覆盖 ControllerTask

Overriding ControllerTask using plugin

我想在烘焙控制器时在模型的模板文件夹中生成一个额外的视图文件。我已将 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);
    

当我 运行 烘焙命令时,我似乎没有收到“哟!”出现:

$ bin/cake bake controller entries -t WetKit

Baking controller class for Entries...

编辑 3

我得到一个错误:

我得到一个错误:

没有错误,但没有输出所需的行:

命令

public function bake($controllerName)
    {
        $this->out("\n" . 'Override damn you!');
    

DebugKitInclude 选项卡下,我看到我的 WetKit 插件已加载。

确认一下,覆盖应该发生在插件的 plugins/WetKit/src/Shell/Task/ 中?

编辑 4

命名空间问题是我的错。我在尝试覆盖任务时引入了这个。

在自动加载器方面,composer.json:

"autoload": {
    "psr-4": {
        "WetKit\": "src/"
    }
},

有:

我决定刷新自动加载文件:

$ 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

如果我更改文件名以匹配 class 名称,作曲家将加载 class 而不会输出 PSR-4 问题。烘焙仍然不起作用,我没有看到 class 变化。

我尝试使用文件名 ControllerTask.php 和 class 名称 WetKitControllerTask 进行烘焙。 Composer 会跳过该文件,但烘焙仍然没有显示我的 class 修改。奇怪。

编辑 5

注意到目标 TemplateTask.php 而不是 ControllerTask.php 的变化。我需要做的更适合 TemplateTask.php.

在 class 和文件名匹配的情况下,我无法烘焙,因为出现如下错误(ControllerTask.php 也发生了):

编辑 6

解决方案:

...
use Bake\Shell\Task\TemplateTask as WetKitTemplateTask;
...
class TemplateTask extends WetKitTemplateTask

我只需要更改名称空间和 class 定义,并将文件放在 plugin/WetKit/src/Shell/Task.

...
use Bake\Shell\Task\TemplateTask as WetKitTemplateTask;
...
class TemplateTask extends WetKitTemplateTask