cakephp 正在使用插件覆盖ControllerTask

xxe27gdn  于 2022-11-11  发布在  PHP
关注(0)|答案(1)|浏览(119)

当我烘焙控制器时,我想在模型的模板文件夹中生成一个额外的视图文件。我已经在我的插件中将ControllerTask.php复制(未更改)到plugins/WetKit/src/Shell/Task中。
例如,对于模型Entries,我希望在烘焙过程中出现一个新文件: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

实现这一目标的最佳方法是什么?

Edit 1:这是否是命名空间问题?
编辑2:

WetKitControllerTask.php所做的编辑,保留原样,但在sprintf函数的输出中添加了“Yo!”:

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命令时,似乎没有出现“Yo!”:

$ 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!');

DebugKit中的Include标签下,我看到我的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
在类和文件名匹配的情况下,我无法进行bake,因为我得到了如下所示的错误(ControllerTask.php也发生了这种情况):

编辑6

解决方法:

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

mxg2im7a1#

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

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

相关问题