Yii2 - 获取未知属性:yii\console\Request::userAgent 和 Class db 不存在

问题描述

我的 Yii2 框架版本 2.0.42.1 有问题,有一个 yii2 高级应用模板项目。

当我运行 yii PHP 脚本时:PHP yii

它返回以下错误

Exception 'yii\base\UnkNownPropertyException' with message 'Getting unkNown property: yii\console\Request::userAgent'

in /usr/src/app/vendor/yiisoft/yii2/base/Component.PHP:155

Stack trace:
#0 /usr/src/app/common/components/VerificationNavigateur.PHP(23): yii\base\Component->__get('userAgent')
#1 /usr/src/app/vendor/yiisoft/yii2/base/BaSEObject.PHP(109): common\components\VerificationNavigateur->init()
#2 /usr/src/app/common/components/AppBootstrap.PHP(20): yii\base\BaSEObject->__construct()
#3 /usr/src/app/vendor/yiisoft/yii2/base/Application.PHP(333): common\components\AppBootstrap->bootstrap(Object(yii\console\Application))
#4 /usr/src/app/vendor/yiisoft/yii2/base/Application.PHP(279): yii\base\Application->bootstrap()
#5 /usr/src/app/vendor/yiisoft/yii2/console/Application.PHP(125): yii\base\Application->init()
#6 /usr/src/app/vendor/yiisoft/yii2/base/BaSEObject.PHP(109): yii\console\Application->init()
#7 /usr/src/app/vendor/yiisoft/yii2/base/Application.PHP(212): yii\base\BaSEObject->__construct(Array)
#8 /usr/src/app/vendor/yiisoft/yii2/console/Application.PHP(90): yii\base\Application->__construct(Array)
#9 /usr/src/app/yii(22): yii\console\Application->__construct(Array)

一切都很好,直到我运行 composer install

即使我尝试降级框架 composer require yiisoft/yii2:2.0.41,也不会改变任何东西。

当我尝试从供应商文件夹运行 PHP 脚本时,一切正常 PHP vendor/bin/yii

但是当我尝试运行迁移 PHP vendor/bin/yii migrate 时,会发生此错误

Yii Migration Tool (based on Yii v2.0.42.1)

Exception 'yii\di\notinstantiableException' with message 'Failed to instantiate component or class "db".'

in /usr/src/app/vendor/yiisoft/yii2/di/Container.PHP:510

Caused by: Exception 'ReflectionException' with message 'Class db does not exist'

in /usr/src/app/vendor/yiisoft/yii2/di/Container.PHP:508

Stack trace:
#0 /usr/src/app/vendor/yiisoft/yii2/di/Container.PHP(508): ReflectionClass->__construct('db')
#1 /usr/src/app/vendor/yiisoft/yii2/di/Container.PHP(386): yii\di\Container->getDependencies('db')
#2 /usr/src/app/vendor/yiisoft/yii2/di/Container.PHP(171): yii\di\Container->build('db',Array,Array)
#3 /usr/src/app/vendor/yiisoft/yii2/di/Instance.PHP(176): yii\di\Container->get('db')
#4 /usr/src/app/vendor/yiisoft/yii2/di/Instance.PHP(145): yii\di\Instance->get(NULL)
#5 /usr/src/app/vendor/yiisoft/yii2/console/controllers/MigrateController.PHP(183): yii\di\Instance::ensure(Object(yii\di\Instance),'yii\\db\\Connecti...')
#6 /usr/src/app/vendor/yiisoft/yii2/base/Controller.PHP(179): yii\console\controllers\MigrateController->beforeAction(Object(yii\base\InlineAction))
#7 /usr/src/app/vendor/yiisoft/yii2/console/Controller.PHP(184): yii\base\Controller->runAction('up',Array)
#8 /usr/src/app/vendor/yiisoft/yii2/base/Module.PHP(534): yii\console\Controller->runAction('up',Array)
#9 /usr/src/app/vendor/yiisoft/yii2/console/Application.PHP(181): yii\base\Module->runAction('migrate/up',Array)
#10 /usr/src/app/vendor/yiisoft/yii2/console/Application.PHP(148): yii\console\Application->runAction('migrate/up',Array)
#11 /usr/src/app/vendor/yiisoft/yii2/base/Application.PHP(392): yii\console\Application->handleRequest(Object(yii\console\Request))
#12 /usr/src/app/vendor/yiisoft/yii2/yii(37): yii\base\Application->run()
#13 {main}

我的数据库配置连接文件没变,common/config/main-local.PHP:

<?PHP
return [
    'components' => [
        'db' => [
            'class' => 'yii\db\Connection','dsn' => 'pgsql:host=172.21.0.3;dbname=dev','username' => 'dev','password' => 'dev','charset' => 'utf8',],...

PHP 版本:7.4

Linux 发行版:Ubuntu 20.04

Yii2 论坛现在因维护而关闭

解决方法

问题出在这个组件 common\components\VerificationNavigateur

您正在通过 Yii::$app->request->userAgent 方法访问 init()。此属性仅在 yii\web\Request 中可用。 在您的应用程序中,即使对于您的控制台应用程序,组件 common\components\VerificationNavigateur 也会被引导。但在这种情况下,属性 Yii::$app->request 包含没有属性 yii\console\RequestuserAgent 实例。

如果您的控制台应用程序中不需要该组件,则应在控制台配置中将其删除。如果您需要在控制台应用程序中使用该组件,您应该修改其 init() 方法以在访问 Yii::$app->request 属性之前检查 yii\web\Request 是否是 userAgent 的实例,例如:>

if (\Yii::$app->request instanceof \yii\web\Request) {
    // ... do something with Yii::$app->request->userAgent
}

php vendor/bin/yii 的情况下,不使用您的应用配置。这就是为什么该组件没有被引导并且您不会遇到该错误的原因。但是,由于未加载配置,因此没有 db 组件的配置并且迁移不起作用。