wuyan
@drodata 的方法是可行的。也找到了其他方法可以不用再模块中替换应用的组件。
研究了一下源代码发现AccessControl在调用User组件的can方法时,如果user组件的$accessChecker属性,如果为空就使用应用的authManager组件,因此,只要设置user组件的这个属性就可以了。于是配置代码改成:
`'modules' => [ 'admin' => [ 'class' => 'mp\modules\admin\Module', 'aliases' => [ '@module' => '@app/modules/admin', ], 'defaultRoute' => 'site', 'components' => [ 'user' => [ 'class' => 'yii\web\User', 'identityClass' => 'common\models\Staff', 'idParam' => '__admin_id', 'enableAutoLogin' => false, 'loginUrl' => '/admin/site/login', 'accessChecker' => 'yii\rbac\DbManager', ], 'errorHandler' => [ 'class' => 'yii\web\ErrorHandler', 'errorAction' => '/admin/site/error', ], ], ], ],
这样修改后就可以工作了,但是存在一个问题是accessChecker的配置只能通过字符串类名初始化一个默认的组件。问题出在User组件init时是判断is_string才使用Yii::createObject方法创建accessChecker属性的,如果需要让这个属性支持配置数组。需要修改User组件的init方法代码如下:
// if (!empty($this->accessChecker) && is_string($this->accessChecker)) {if (!empty($this->accessChecker) && (is_string($this->accessChecker) || is_array($this->accessChecker)) { $this->accessChecker = Yii::createObject($this->accessChecker); }
或者更进一步,改成这种形式,除了支持通过类名配置和数组配置外还能引用其他已经定义的组件。
if (!empty($this->accessChecker)) {$this->accessChecker = Instance::ensure($this->accessChecker, BaseManager::className()); }
// if (!empty($this->accessChecker) && is_string($this->accessChecker)) {
// $this->accessChecker = Yii::createObject($this->accessChecker);
// }
`
不过很遗憾这个办法只能支持引用应用的组件而不能引用自己模块的组件。是前后台,但是和你的例子不同的是,我这里前后台在同一个应用里面,后台作为整个应用的一个模块存在而不是一个独立的应用
和这个问题中的场景不一样,这个问题里面是同一个项目下的不同应用使用不同的authManager。而我的场景是同一个项目下同一个应用下面的应用和应用的子模块之间使用不同的authManager
五险一金不应该是法律的底线么?怎么成两点了?