当我烘焙控制器时,我想在模型的模板文件夹中生成一个额外的视图文件。我已经在我的插件中将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
1条答案
按热度按时间mxg2im7a1#
我只需要更改名称空间和类定义,并将文件放在
plugin/WetKit/src/Shell/Task
下。