首页 > 解决方案 > 使用插件覆盖 ControllerTask

问题描述

当我烘焙控制器时,我想在模型的模板文件夹中生成一个额外的视图文件。我已经复制(尚未更改)ControllerTask.phpplugins/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

我收到一个错误:

我收到一个错误:

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

命令

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/"
    }
},

和:

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

$ 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

标签: phpcakephpcakephp-3.0cakephp-bake

解决方案


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

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

推荐阅读