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

时间:2016-06-24 20:26:37

标签: php authentication console-application symfony

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

2 个答案:

答案 0 :(得分:8)

您可以使用php_sapi_name() function or PHP_SAPI constant检查命令是从控制台运行还是从控制器运行(类似于php_sapi_name())

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

答案 1 :(得分:0)

symfony控制台应用程序没有像HttpKernel这样的防火墙层。

控制台组件专为小型管理员而设计。任务,而不是面向个人用户的任务。

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

"命令"由受保护并具有用户的Web控制器创建,并且在CLI命令(对于crontab)中没有任何安全检查。

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

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

之后的Symfony Command非常渺茫,就像将输入args传递给命令处理程序一样。喜欢它应该。

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

请注意命名冲突。这是一个symfony console命令!==命令总线命令。

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

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