在Laravel 5中如何获取当前使用的Artisan控制台命令名称?

6

问题 / 我尝试过的方法:

Laravel 5 中获取当前使用的控制器和操作很容易(但不如它应该的那么容易),然而我无法获取当前使用的 artisan 控制台命令。

要获取控制器名称,我这样做:

$route = Route::getRoutes()->match(Request::capture());
$listAction = explode('\\', $route->getActionName());
$rawAction = end($listAction);
// controller name and action in a simple array
$controllerAndAction = explode('@', $rawAction);

但是,当从控制台操作中调用时,它总是返回默认的索引控制器名称(在 Laravel 中为 "IndexController" 或类似名称)。有人知道如何解决这个问题吗?
顺便说一下,我也尝试过使用 Request::capture(),但这仍然没有提供关于命令的信息。

但是当从控制台操作中调用时,它总是返回默认索引控制器的名称。你如何从命令行调用它? - The Alpha
@TheAlpha 通过 php artisan mycommand - Sliq
1
你实际上需要了解哪些关于命令的信息?是它的名称吗? - Fabrizio D'Ammassa
1
当您从控制台运行时,没有请求。只有在使用 Http 内核时才有请求可用。 - The Alpha
3个回答

8

最简单的方法就是查看在命令行上指定的参数:

if (array_get(request()->server(), 'argv.1') === 'cache:clear') {
    // do things
}

是的,你可以直接使用$_SERVER,但我喜欢使用辅助函数或门面,因为它们将提供给你当前的数据。

我假设-在单元测试期间-超级全局变量可能不总是反映当前测试的请求。

顺便说一句:显然也可以执行array_get(request()->server('argv'), '1')或类似的操作。(request()->server('argv.1')在这一点上不起作用)。或者使用\Request::server()。取决于你最喜欢什么。


4
根据Symfony\Component\Console\Command\Command类,返回命令名称(例如my:command)的方法为:
$this->getName();

您应该在继承Illuminate\Console\Command的Artisan命令中使用它(默认情况下为Artisan命令)。

请记住,它只会返回命令名称,而不是可用参数(例如,对于命令签名my:command {--with-params=},它只会返回my:command)。


-2

反射可能会有所帮助?试试这个:

$var = new \ReflectionClass($this);
dd($var);

1
这怎样帮助 OP 获得 Artisan 命令名称?!如果你真的认为这应该成为被接受的答案,请提供更多关于他如何能够实现目标的见解。 - dmmd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接