如题: 目前我想在fecshop的基础上开发一个三方登录,module目前文档中的重写功能仅提供了完全重写的指导。 这种方法导致了我复制了很多controller出来。 本地想使用继承module的方式,并没能把local的controller加入路由中。 想问下除了全面覆盖重写module的方法,支持继承module的写法吗?
追问一句,你是否仅想给一个 module 添加新的控制器?
如果是这样,yii2 的 controllerMap 了解一下,只需 copy 一份 module 的配置文件到 local 目录,然后添加关于 controller 的配置。重写 controller 与开发新的 controller 完全一致。
参考:
@successgdc #1楼 正解。对YII2.0不是很熟,直接上手的Fecshop 🙏
欢迎点赞加关注。
https://github.com/successgdc
@xuhuaiqu 我也是直接上手 fecshop,上手前熟悉了一遍 yii2 官方文档。
@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(); }
否则将会找不到文件。
哦,这个还不曾留意到。
@successgdc #6楼 或者直接namespace use进来block文件,直接使用,这样就不需要getBlock方法了
namespace use
block文件
getBlock
文档整理:http://www.fecshop.com/doc/fecshop-guide/instructions/cn-1.0/guide-fecshop_new_controller_in_current_modules.html