无法使用我的插件覆盖 BakeHelper

Cannot override BakeHelper using my plugin

到目前为止,我已经能够通过添加和别名化父任务来覆盖我自己的插件中的 ControllerTaskModelTaskTemplateTask。使用 ModelTask.

的示例
namespace WetKit\Shell\Task;
...
use Bake\Shell\Task\ModelTask as WetKitModelTask;

class ModelTask extends WetKitModelTask
{...}

但是,当我尝试将相同的逻辑应用于位于 plugin/WetKit/src/View/HelperBakeHelper.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');

另见