Php 在null上调用成员函数getDb()

Php 在null上调用成员函数getDb(),php,rest,yii2,yii2-user,Php,Rest,Yii2,Yii2 User,我正在使用Yii2框架和dektrium/Yii2 user模块在restful环境中处理身份验证 这是我的API目录结构: api ├── config │   ├── api.php │   ├── bootstrap.php │   ├── params.php │   └── routes.php ├── index.php ├── modules │   └── v1 │   ├── controllers │   │   └── UserController.php

我正在使用Yii2框架和
dektrium/Yii2 user
模块在restful环境中处理身份验证

这是我的API目录结构:

api
├── config
│   ├── api.php
│   ├── bootstrap.php
│   ├── params.php
│   └── routes.php
├── index.php
├── modules
│   └── v1
│       ├── controllers
│       │   └── UserController.php
│       ├── models
│       │   └── User.php
│       └── Module.php
└── runtime
api.php

...
$config = [
    ...
    'components' => [
        'user' => [
            'identityClass'  => 'app\api\modules\v1\models\User',
            'enableAutoLogin'  => false,
        ],
        'request' => [
            'parsers' => [
                'application/json' => 'yii\web\JsonParser',
            ]
        ],
        'urlManager' => [
            'class' => 'yii\web\UrlManager',
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => require(__DIR__ . '/routes.php'),
        ],
        'db' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=localhost;dbname=DBname',
            'username' => 'DBusername',
            'password' => 'DBpassword',
            'charset' => 'utf8'
        ],
    ],
    'modules' => [
        'v1' => [
            'class' => 'app\api\modules\v1\Module',
            'controllerNamespace' => 'app\api\modules\v1\controllers',
        ],
    ],
    ...
];
...
class UserController extends ActiveController
{
    public $modelClass = 'app\api\modules\v1\models\User';

    public function behaviors()
    {
        $behaviors = parent::behaviors();
        $behaviors['authenticator'] = [
            'class' => HttpBearerAuth::className(),
        ];
        return $behaviors;
    }
}
use dektrium\user\models\User as Base;

class User extends Base
{
    public static function findIdentityByAccessToken($token, $type = null)
    {
        return static::findOne(['auth_key' => $token]);
    }
}
UserController.php

...
$config = [
    ...
    'components' => [
        'user' => [
            'identityClass'  => 'app\api\modules\v1\models\User',
            'enableAutoLogin'  => false,
        ],
        'request' => [
            'parsers' => [
                'application/json' => 'yii\web\JsonParser',
            ]
        ],
        'urlManager' => [
            'class' => 'yii\web\UrlManager',
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => require(__DIR__ . '/routes.php'),
        ],
        'db' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=localhost;dbname=DBname',
            'username' => 'DBusername',
            'password' => 'DBpassword',
            'charset' => 'utf8'
        ],
    ],
    'modules' => [
        'v1' => [
            'class' => 'app\api\modules\v1\Module',
            'controllerNamespace' => 'app\api\modules\v1\controllers',
        ],
    ],
    ...
];
...
class UserController extends ActiveController
{
    public $modelClass = 'app\api\modules\v1\models\User';

    public function behaviors()
    {
        $behaviors = parent::behaviors();
        $behaviors['authenticator'] = [
            'class' => HttpBearerAuth::className(),
        ];
        return $behaviors;
    }
}
use dektrium\user\models\User as Base;

class User extends Base
{
    public static function findIdentityByAccessToken($token, $type = null)
    {
        return static::findOne(['auth_key' => $token]);
    }
}
User.php

...
$config = [
    ...
    'components' => [
        'user' => [
            'identityClass'  => 'app\api\modules\v1\models\User',
            'enableAutoLogin'  => false,
        ],
        'request' => [
            'parsers' => [
                'application/json' => 'yii\web\JsonParser',
            ]
        ],
        'urlManager' => [
            'class' => 'yii\web\UrlManager',
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => require(__DIR__ . '/routes.php'),
        ],
        'db' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=localhost;dbname=DBname',
            'username' => 'DBusername',
            'password' => 'DBpassword',
            'charset' => 'utf8'
        ],
    ],
    'modules' => [
        'v1' => [
            'class' => 'app\api\modules\v1\Module',
            'controllerNamespace' => 'app\api\modules\v1\controllers',
        ],
    ],
    ...
];
...
class UserController extends ActiveController
{
    public $modelClass = 'app\api\modules\v1\models\User';

    public function behaviors()
    {
        $behaviors = parent::behaviors();
        $behaviors['authenticator'] = [
            'class' => HttpBearerAuth::className(),
        ];
        return $behaviors;
    }
}
use dektrium\user\models\User as Base;

class User extends Base
{
    public static function findIdentityByAccessToken($token, $type = null)
    {
        return static::findOne(['auth_key' => $token]);
    }
}
当我试图通过curl发出HTTP POST请求时,如下所示:

curl -H 'Accept:application/json' -H "Authorization: Bearer <Token>" http://<url>/api/v1/users
当我检查每个步骤的结果时,我发现
\Yii::$app->getModule('user')
值为
null


您知道如何修复此错误吗?

您没有
用户
模块-您可以尝试添加一个有效的模块:

'modules' => [
    'v1' => [
        'class' => 'app\api\modules\v1\Module',
        'controllerNamespace' => 'app\api\modules\v1\controllers',
    ],
    'user' => [
        'class' => 'dektrium\user\Module',
        'admins' => ['your_admin_username'],
        'enableRegistration' => false,
        'enableConfirmation' => false,
        'mailer' => ['welcomeSubject' => 'welcome in my application  '],
    ],
    // ... 
],
// ...

请注意,这还将启用和引导整个模块,并注册一些组件和URL规则。如果只在某些RESTAPI中使用模型,则可能会出现问题。