错误:在null上调用成员函数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'为null
根据: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配置文件正确加载db连接,但authManager始终为null。
这是使用yii2admin rbac管理扩展时的问题,但在使用yii2-advanced-app时通常不会,因为高级应用程序使用\Yii::$app->authManager
而不是yii2 rbac Configs::authManager
任何帮助或指针将不胜感激。谢谢。
(根据csminb的评论)
代码在DbManager的yii \ rbac \ ManagerInterface实现上失败了。
在我们的程序中扩展的Dbmanager已经从BaseManager扩展,而BaseManager又实现了ManagerInterface。
由于DbManager和BaseManager被扩展,它们指向扩展的ManagerInterface,它从不需要首先扩展。 :-(
所以解决方法是从以下位置更改BaseManager.php:
abstract class BaseManager extends Component implements ManagerInterface
至:
abstract class BaseManager extends Component implements \yii\rbac\ManagerInterface
值得注意的是,这些扩展文件位于以下文件夹中:namespace common \ components \ extended \ rbac;
再次感谢@csminb和stackoverflow非常有帮助。