无法使用我的插件覆盖 BakeHelper
Cannot override BakeHelper using my plugin
到目前为止,我已经能够通过添加和别名化父任务来覆盖我自己的插件中的 ControllerTask
、ModelTask
和 TemplateTask
。使用 ModelTask
.
的示例
namespace WetKit\Shell\Task;
...
use Bake\Shell\Task\ModelTask as WetKitModelTask;
class ModelTask extends WetKitModelTask
{...}
但是,当我尝试将相同的逻辑应用于位于 plugin/WetKit/src/View/Helper
的 BakeHelper.php
时,它不起作用并且找不到功能:
me@laptop MINGW64 ~/Downloads/xampp3/xampp/htdocs/twofk (master)
$ bin/cake bake controller dummy_lists -t WetKit
*** WetKit Controller Task! ***
Baking controller class for DummyLists...
Warning Error: Method Bake\View\Helper\BakeHelper::isBilingualTable does not exist in [C:\Users\me\Downloads\xampp3\xampp\htdocs\twofk\vendor\cakephp\cakephp\src\View\Helper.php, line 116]
这是我的自定义 BakeHelper
class 定义:
namespace WetKit\View\Helper;
...
use Bake\View\Helper as WetKitHelper;
/**
* Bake helper
*/
class BakeHelper extends WetKitHelper
{
...
public function isBilingualTable($table)
{...}
}
如果我将文件放在 vendor 文件夹下,这将起作用。
助手不能像任务一样被“覆盖”,因为它们的加载方式完全不同。正在将任务收集到列表中,稍后收集的任务可以替换列表中的现有条目,以防它们使用相同的名称。
Helper 是通过 CakePHP 的默认 helper 加载功能加载的,例如 loadeHelper()
,特别是使用解析为完全限定类名的短名称,无法替换。
除非您真的想覆盖任何烘焙助手功能,否则没有理由不使用单独的助手,您可以在 Bake.initialize
事件中加载它:
// in your plugin's bootstrap
\Cake\Event\EventManager::instance()
->on('Bake.initialize', function (\Cake\Event\EventInterface $event) {
/** @var \Cake\View\View $view */
$view = $event->getSubject();
// load `\WetKit\View\Helper\CustomBakeHelper`
$view->loadHelper('WetKit.CustomBake');
});
然后可以在烘焙树枝模板中像 CustomBake.isBilingualTable(...)
一样使用助手。
为了完成,如果您确实需要覆盖烘焙助手,您首先必须卸载现有的,然后加载您的:
$view->helpers()->unload('Bake');
$view->loadHelper('WetKit.Bake');
另见
到目前为止,我已经能够通过添加和别名化父任务来覆盖我自己的插件中的 ControllerTask
、ModelTask
和 TemplateTask
。使用 ModelTask
.
namespace WetKit\Shell\Task;
...
use Bake\Shell\Task\ModelTask as WetKitModelTask;
class ModelTask extends WetKitModelTask
{...}
但是,当我尝试将相同的逻辑应用于位于 plugin/WetKit/src/View/Helper
的 BakeHelper.php
时,它不起作用并且找不到功能:
me@laptop MINGW64 ~/Downloads/xampp3/xampp/htdocs/twofk (master)
$ bin/cake bake controller dummy_lists -t WetKit
*** WetKit Controller Task! ***
Baking controller class for DummyLists...
Warning Error: Method Bake\View\Helper\BakeHelper::isBilingualTable does not exist in [C:\Users\me\Downloads\xampp3\xampp\htdocs\twofk\vendor\cakephp\cakephp\src\View\Helper.php, line 116]
这是我的自定义 BakeHelper
class 定义:
namespace WetKit\View\Helper;
...
use Bake\View\Helper as WetKitHelper;
/**
* Bake helper
*/
class BakeHelper extends WetKitHelper
{
...
public function isBilingualTable($table)
{...}
}
如果我将文件放在 vendor 文件夹下,这将起作用。
助手不能像任务一样被“覆盖”,因为它们的加载方式完全不同。正在将任务收集到列表中,稍后收集的任务可以替换列表中的现有条目,以防它们使用相同的名称。
Helper 是通过 CakePHP 的默认 helper 加载功能加载的,例如 loadeHelper()
,特别是使用解析为完全限定类名的短名称,无法替换。
除非您真的想覆盖任何烘焙助手功能,否则没有理由不使用单独的助手,您可以在 Bake.initialize
事件中加载它:
// in your plugin's bootstrap
\Cake\Event\EventManager::instance()
->on('Bake.initialize', function (\Cake\Event\EventInterface $event) {
/** @var \Cake\View\View $view */
$view = $event->getSubject();
// load `\WetKit\View\Helper\CustomBakeHelper`
$view->loadHelper('WetKit.CustomBake');
});
然后可以在烘焙树枝模板中像 CustomBake.isBilingualTable(...)
一样使用助手。
为了完成,如果您确实需要覆盖烘焙助手,您首先必须卸载现有的,然后加载您的:
$view->helpers()->unload('Bake');
$view->loadHelper('WetKit.Bake');
另见