local app 如何继承一个module,为fecshop的module添加新的controller

技术问题 · xuhuaiqu · 于 5年前 发布 · 2183 次阅读

如题: 目前我想在fecshop的基础上开发一个三方登录,module目前文档中的重写功能仅提供了完全重写的指导。 这种方法导致了我复制了很多controller出来。 本地想使用继承module的方式,并没能把local的controller加入路由中。 想问下除了全面覆盖重写module的方法,支持继承module的写法吗?

共收到 8 条回复 问题提问
successgo#15年前 2 个赞

追问一句,你是否仅想给一个 module 添加新的控制器?

如果是这样,yii2 的 controllerMap 了解一下,只需 copy 一份 module 的配置文件到 local 目录,然后添加关于 controller 的配置。重写 controller 与开发新的 controller 完全一致。

参考: controllerMap 示例

xuhuaiqu#25年前 0 个赞

@successgdc #1楼 正解。对YII2.0不是很熟,直接上手的Fecshop 🙏

successgo#35年前 1 个赞

欢迎点赞加关注。

https://github.com/successgdc

successgo#45年前 1 个赞

@xuhuaiqu 我也是直接上手 fecshop,上手前熟悉了一遍 yii2 官方文档。

Fecmall#55年前 1 个赞

@successgdc [#1楼](#comment1)

恩,用这种方式,同时也会存在一个问题controller中的getBlock()不可用

譬如:https://github.com/fecshop/yii2_fecshop/blob/master/app/appfront/modules/AppfrontController.php

因此可以在本地新建一个base controller , 继承模块原来的 base controller(上面的AppfrontController.php,就是module的 base controller),然后重写getBlock()方法。

public function getBlock($blockName = '')
    {
        if (!$blockName) {
            $blockName = $this->action->id;
        }
        if (!$this->blockNamespace) {
            $this->blockNamespace = Yii::$app->controller->module->blockNamespace;
        }
        if (!$this->blockNamespace) {
            throw new \yii\web\HttpException(406, 'blockNamespace is empty , you should config it in module->blockNamespace or controller blockNamespace ');
        }
        $viewId = $this->id;
        $viewId = str_replace('/', '\\', $viewId);
        $relativeFile = '\\'.$this->blockNamespace;
        $relativeFile .= '\\'.$viewId.'\\'.ucfirst($blockName);
        //查找是否在rewriteMap中存在重写
        $relativeFile = Yii::mapGetName($relativeFile);
        
        return new $relativeFile();
    }

否则将会找不到文件。

successgo#65年前 0 个赞

哦,这个还不曾留意到。

Fecmall#75年前 0 个赞

@successgdc #6楼 或者直接namespace use进来block文件,直接使用,这样就不需要getBlock方法了

添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册
Your Site Analytics