【问题标题】:Overriding ControllerTask using plugin使用插件覆盖 ControllerTask
【发布时间】:2021-10-08 13:28:59
【问题描述】:

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

DebugKitInclude 标签下,我看到我的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

【问题讨论】:

  • 如果您没有更改文件中的任何内容,那么可以肯定的是,该命名空间将不起作用。现在没有时间进行彻底的回答,但您最好扩展插件的烘焙任务,或者改用事件:book.cakephp.org/bake/1/en/development.html
  • 我尝试过扩展。 Cake bake 没有抱怨,但也没有显示班级的微小变化。可能遗漏了一些小细节?
  • 你必须将你的任务类命名为ControllerTask,否则它的名字将映射到wet_kit_controller。注意覆盖任务和主题无关,是个通用的东西,只看插件是否加载,是否有效取决于插件的名称,具体来说,插件必须命名为so在构建任务列表时,它会按字母顺序 Bake 之后按字母顺序排序plugins are processed
  • 它必须是ControllerTask(扩展烘焙插件的ControllerTask),在src/Shell/Task/ControllerTask.php 中具有WetKit\Shell\Task 的命名空间。调试 github.com/cakephp/bake/blob/1.12.0/src/Shell/… 以确定是否在任务映射中找到并正确设置了任务。
  • 看看 PhpStorm 向您显示的那些红色波浪线......您必须使用别名进行扩展,或者使用完全限定的名称。

标签: php cakephp cakephp-3.0 cakephp-bake


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2018-05-15
    • 2023-03-16
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    相关资源
    最近更新 更多