【问题标题】:How to get currently used Artisan console command name in Laravel 5?如何在 Laravel 5 中获取当前使用的 Artisan 控制台命令名称?
【发布时间】:2016-06-20 20:30:04
【问题描述】:

问题/我尝试过的:

在 Laravel 5 中获取当前使用的控制器和动作很容易(但没有应有的那么容易),但是我一直坚持获取当前使用的工匠控制台命令。

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

$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() 工作过,但这仍然没有提供有关该命令的信息。

【问题讨论】:

  • But when calling from a console action, it always returns the default index controller's name 你如何从命令行调用它?
  • @TheAlpha 通过 php artisan mycommand
  • 您实际上需要了解有关您的命令的哪些信息?它的名字?
  • 从控制台运行时没有请求。该请求仅在您使用Http Kernel 时可用。

标签: php laravel laravel-artisan


【解决方案1】:

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

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

是的,您可以直接使用$_SERVER,但我喜欢使用辅助函数或外观,因为它们会为您提供当前数据。 我的假设是 - 在单元测试期间 - 超全局变量可能并不总是反映当前测试的请求。

顺便说一句:显然也可以做array_get(request()->server('argv'), '1')或类似的东西。 (request()->server('argv.1') 此时不起作用)。或使用\Request::server()。看你最喜欢什么。

【讨论】:

    【解决方案2】:

    根据Symfony\Component\Console\Command\Command类,返回命令名称(例如my:command)的方法是:

    $this->getName();
    

    您应该在扩展 Illuminate\Console\Command 的 Artisan 命令中使用它(Artisan 命令的默认设置)。

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 这如何帮助 OP 获得 Artisan 命令名称?!如果您真的认为这应该是公认的答案,请提供更多关于他将如何实现目标的见解。
      猜你喜欢
      • 2015-11-06
      • 2016-04-10
      • 2022-06-14
      • 2018-02-21
      • 2019-07-23
      • 2016-07-30
      • 2015-04-06
      • 2023-04-02
      • 2017-10-14
      相关资源
      最近更新 更多