Symfony -如何知道控制台命令是从控制器运行还是从终端运行


Symfony - how to know if console command was run from controller or it was run from terminal?

我正在构建使用控制台命令的Symfony应用程序。同样的控制台命令可以从控制器true事件执行,但也可以从终端运行。如果命令是从终端运行的,我如何从命令运行的位置找出它,以便我可以实现用户身份验证?如果命令是从控制器上运行的,那么用户已经具有运行的权限。但是如果它已经从终端运行,他必须通过用户名和密码进行身份验证,以便我检查他是否有必要的角色?

您可以使用php_sapi_name()函数或PHP_SAPI常量(类似于php_sapi_name())检查命令是从控制台还是从控制器运行的

if ('cli' === PHP_SAPI) {
    // command was run from the console
} else {
    // command was run from a controller
}

symfony Console应用程序没有像HttpKernel那样的防火墙层。

控制台组件是为小型"管理类"任务而构建的,而不是面向个人用户的东西。

整个问题可以通过实现命令总线模式来解决。

"命令"是由安全的web控制器创建的,并且在CLI命令(对于crontab)中有一个用户,没有任何安全检查。

然后将其传递给命令总线,该总线处理命令处理程序。

Handler包含execute方法的当前逻辑。命令对象将包含执行这些逻辑的任何数据==您当前的输入参数和选项。

之后的Symfony命令非常简洁,就像将输入参数传递给命令处理程序一样。应该是这样的。

如果它是一个长时间运行的任务,它甚至可以从web请求中卸载到工作队列中。

请注意命名冲突。这里有一个symfony控制台命令!==命令总线命令。

例如,你可以在Symfony中使用SimpleBus:https://github.com/SimpleBus

还有@skoop最近关于命名问题的博文:http://leftontheweb.com/blog/2016/06/18/Command-or-Controller/