cakephp 无法使用我的插件覆盖BakeHelper

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

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

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类定义:

namespace WetKit\View\Helper;
...
use Bake\View\Helper as WetKitHelper;

/**
 * Bake helper
 */
class BakeHelper extends WetKitHelper
{
    ...

    public function isBilingualTable($table)
       {...}
}

如果我把文件放在vendor文件夹下,这将起作用。

kulphzqa

kulphzqa1#

助手不能像任务一样被“覆盖”,因为它们的加载方式完全不同。任务被收集在一个列表中,如果它们使用相同的名称,在稍后收集的任务可以替换列表中的现有条目。
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');

另请参阅


相关问题