错误:对成员函数getRoles()的调用为空
来自:yii2-admin \ models \ searchs \ AuthItem.php
第75行:
public function search($params)
{
/* @var \yii\rbac\Manager $authManager */
$authManager = Configs::authManager();
if ($this->type == Item::TYPE_ROLE) {
here-> $items = $authManager->getRoles();
} else {
这是因为yii2-admin \ components \ configs.php:
第148行:
public static function instance()
{
if (self::$_instance === null) {
$type = ArrayHelper::getValue(Yii::$app->params, 'mdm.admin.configs', []);
if (is_array($type) && !isset($type['class'])) {
$type['class'] = static::className();
}
return self::$_instance = Yii::createObject($type);
}
here-> return self::$_instance;
}
它返回一个配置对象,其中“ authManager”为空
根据: Yii2 RBAC DbManager error Call to a member function getRole() on null
和
https://www.yiiframework.com/doc/guide/2.0/en/security-authorization#configuring-rbac-manager
yii2-advanced-app所需要做的就是添加以下内容:
'authManager' => [
'class' => 'common\components\extended\rbac\DbManager',
'cache' => 'cache',
],
到组件数组下的common \ config \ main.php
那已经存在并且似乎不会影响rbac的配置。 另外,我尝试将authManager添加到控制台,前端和后端配置文件中,但无效。
预期结果:'authManager' => 'DbManager or something'
实际结果:'authManager' => null
yii2 rbac配置文件已正确加载到数据库连接中,但是authManager始终为空。
在使用yii2admin rbac管理扩展时,这是一个问题,但是在一般情况下,使用yii2-advanced-app时,这不是问题,因为高级应用使用\Yii::$app->authManager
而不是yii2 rbac Configs::authManager
任何帮助或指针将不胜感激。谢谢。
答案 0 :(得分:0)
(基于csminb的评论)
该代码在DbManager的yii \ rbac \ ManagerInterface的实现中失败。
我们程序中扩展的Dbmanager已经从BaseManager扩展,后者又实现了ManagerInterface。
由于DbManager和BaseManager进行了扩展,因此它们指向扩展的ManagerInterface,而该扩展不需要首先进行扩展。 :-(
因此解决方法是将BaseManager.php从以下位置更改:
abstract class BaseManager extends Component implements ManagerInterface
收件人:
abstract class BaseManager extends Component implements \yii\rbac\ManagerInterface
请务必注意,这些扩展文件位于文件夹中: 命名空间common \ components \ extended \ rbac;
再次感谢@csminb和stackoverflow,它们非常有用。