yii2admin覆盖对null的成员函数getRoles()的调用:authManager不从配置文件中读取

时间:2019-03-27 13:50:37

标签: php yii2 yii2-advanced-app rbac yii2-rbac

错误对成员函数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

任何帮助或指针将不胜感激。谢谢。

1 个答案:

答案 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,它们非常有用。