Yii2 如何检测我是否处于';控制台';模式

Yii2 如何检测我是否处于';控制台';模式,yii2,Yii2,我正在编写一个从浏览器运行的应用程序。但是,也可以从Yii2控制台调用一些模型函数。因此,我在尝试访问GUI中设置的变量时出错 有可能知道我处于哪种模式吗?是否自动设置了一些环境变量,或者我应该在控制台应用程序中设置一些会话变量来指示状态?您可以使用 if (Yii::$app instanceof \yii\console\Application) 用于控制台,以及 if (Yii::$app instanceof \yii\web\Application) 对于web。Yii2为应用程序

我正在编写一个从浏览器运行的应用程序。但是,也可以从Yii2控制台调用一些模型函数。因此,我在尝试访问GUI中设置的变量时出错

有可能知道我处于哪种模式吗?是否自动设置了一些环境变量,或者我应该在控制台应用程序中设置一些会话变量来指示状态?

您可以使用

if (Yii::$app instanceof \yii\console\Application)
用于控制台,以及

if (Yii::$app instanceof \yii\web\Application)

对于web。

Yii2为应用程序的
控制台和
web
类型的控制台提供了许多不同的类。除了对类的操作模式进行划分外,还有一组规则用于管理应用程序代码的组织。首先,最基本的一点是,提供MVC模型对象信息,查看与用户的管理界面,最后向控制器提供它们之间的协调作用。在您的例子中,似乎感觉到一段代码在控制台中运行,但引用了提供Web界面的类。可能是因为在一些模型类中引入了带有HTML或其他不应该存在的代码的函数。如果您需要两个独立的应用程序,则应该精确地将使用类型控件的应用程序分开

yii\console\Controller 
另一种是使用控制器类型web

yii\web\Controller. 

显然,模型类将是通用的,而且,由于使用了单独的控制器,请确保调用与所使用的用户界面类型相适应的视图。我希望这会有用。

对于console,默认情况下:

Yii::$app->id == 'basic-console'
对于web应用程序:

Yii::$app->id == 'basic'

Yii::$app->id
存储加载的配置参数的id。默认情况下,对于控制台应用程序,它是
'basic-console'
,而对于web应用程序,它是
'basic'
(在配置文件中定义)

有一种更简单的方法来解决这个问题,而无需查看
Yii
对象

if (php_sapi_name() == "cli") {
    return;
}
…它适用于所有PHP脚本 …而且它更轻

正确的变体

Yii::$app->request->isConsoleRequest

适用于nginx和apache:

function isConsole()
{
    return 'cli' == php_sapi_name() || !array_key_exists('REQUEST_URI', $_SERVER);
}
纯PHP:

global $argv;
if (empty($argv)) {
  // Browser mode
}
else {
  // Cli mode
}

isConsoleRequest
基本上是
PHP\u SAPI==='cli'
的快捷方式。这可能不如检查
Yii::$app
类型灵活。例如,对于从控制台运行的测试,您可能希望模拟web应用程序
isConsoleRequest
将返回
true
,即使您有web应用程序。因此,当您想使用PHPCLI功能而不是确定当前使用哪种类型的应用程序时,这更有用。最好且灵活的检查方法。