Yii2 - 未知 属性:yii\console\Request::userAgent 和 Class 数据库不存在
Yii2 - Getting unknown property: yii\console\Request::userAgent and Class db does not exist
我有一个 Yii2 框架版本 2.0.42.1 的问题,有一个 yii2 高级应用程序模板项目。
当我运行 yii php 脚本时:php yii
.
它 returns 我出现以下错误:
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 version: 7.4
Linux distribution: Ubuntu 20.04
Yii2 论坛暂时关闭维护。
问题出在这个组件 common\components\VerificationNavigateur
。
您正在其 init()
方法中访问 Yii::$app->request->userAgent
。此 属性 仅在 yii\web\Request
中可用。
在您的应用程序中,组件 common\components\VerificationNavigateur
甚至对于您的控制台应用程序都是自举的。但在那种情况下,属性 Yii::$app->request
包含 yii\console\Request
的实例,但没有 属性 userAgent
.
如果您的控制台应用程序中不需要该组件,您应该在控制台配置中将其删除。如果您在控制台应用程序中需要该组件,您应该修改其 init()
方法以在访问 userAgent
属性 之前检查 Yii::$app->request
是否是 yii\web\Request
的实例,例如这个:
if (\Yii::$app->request instanceof \yii\web\Request) {
// ... do something with Yii::$app->request->userAgent
}
在 php vendor/bin/yii
的情况下,您的应用配置未被使用。这就是为什么该组件未被引导并且您不会遇到该错误的原因。但是,由于未加载配置,因此没有 db
组件的配置并且迁移无法正常进行。
我有一个 Yii2 框架版本 2.0.42.1 的问题,有一个 yii2 高级应用程序模板项目。
当我运行 yii php 脚本时:php yii
.
它 returns 我出现以下错误:
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 version: 7.4
Linux distribution: Ubuntu 20.04
Yii2 论坛暂时关闭维护。
问题出在这个组件 common\components\VerificationNavigateur
。
您正在其 init()
方法中访问 Yii::$app->request->userAgent
。此 属性 仅在 yii\web\Request
中可用。
在您的应用程序中,组件 common\components\VerificationNavigateur
甚至对于您的控制台应用程序都是自举的。但在那种情况下,属性 Yii::$app->request
包含 yii\console\Request
的实例,但没有 属性 userAgent
.
如果您的控制台应用程序中不需要该组件,您应该在控制台配置中将其删除。如果您在控制台应用程序中需要该组件,您应该修改其 init()
方法以在访问 userAgent
属性 之前检查 Yii::$app->request
是否是 yii\web\Request
的实例,例如这个:
if (\Yii::$app->request instanceof \yii\web\Request) {
// ... do something with Yii::$app->request->userAgent
}
在 php vendor/bin/yii
的情况下,您的应用配置未被使用。这就是为什么该组件未被引导并且您不会遇到该错误的原因。但是,由于未加载配置,因此没有 db
组件的配置并且迁移无法正常进行。