使用插件覆盖 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
我得到一个错误:
- 文件:
plugins/WetKit/src/Shell/Task/WetKitControllerTask.php
- class 姓名:
ControllerTask
- 结果:
Cannot declare class Wetkit\Bake\Shell\Task\ControllerTask because the name is already in use
我得到一个错误:
- 文件:
plugins/WetKit/src/Shell/Task/ControllerTask.php
- class 姓名:
ControllerTask
- 结果:
Cannot declare class Wetkit\Bake\Shell\Task\ControllerTask because the name is already in use
没有错误,但没有输出所需的行:
- 文件:
plugins/WetKit/src/Shell/Task/ControllerTask.php
- class 姓名:
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
- Class 姓名:
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
如果我更改文件名以匹配 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
我想在烘焙控制器时在模型的模板文件夹中生成一个额外的视图文件。我已将 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
我得到一个错误:
- 文件:
plugins/WetKit/src/Shell/Task/WetKitControllerTask.php
- class 姓名:
ControllerTask
- 结果:
Cannot declare class Wetkit\Bake\Shell\Task\ControllerTask because the name is already in use
我得到一个错误:
- 文件:
plugins/WetKit/src/Shell/Task/ControllerTask.php
- class 姓名:
ControllerTask
- 结果:
Cannot declare class Wetkit\Bake\Shell\Task\ControllerTask because the name is already in use
没有错误,但没有输出所需的行:
- 文件:
plugins/WetKit/src/Shell/Task/ControllerTask.php
- class 姓名:
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
- Class 姓名:
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
如果我更改文件名以匹配 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