【问题标题】:Get response from Artisan call从 Artisan 电话中获得响应
【发布时间】:2014-04-24 11:55:24
【问题描述】:

当我在终端 php artisan migrate 中运行时,当确实没有要迁移的东西时,这会导致“没有要迁移的东西”。

当我在代码中使用 Artisan::call('migrate') 时(在自定义 Artisan 命令中使用它),这不会返回任何消息。它只是执行代码而没有任何反馈。

如果我 vardump()Artisan::call 方法的结果,它只会返回一个 int(0)

是否可以得到Artisan调用方法的响应?

【问题讨论】:

    标签: php laravel laravel-4


    【解决方案1】:

    对我来说,使用 Laravel 5.1 这一切都不起作用,但你可以简单地使用:

    Artisan::output()
    

    【讨论】:

    • 请注意,这只会在你使用Artisan::run('') 时捕获输出,否则你会得到一个空输出,它不是一个捕获所有命令的输出
    【解决方案2】:

    我可以通过以下方式获得 Artisan::call() 的输出:

    use Symfony\Component\Console\Output\StreamOutput;
    
    $stream = fopen("php://output", "w");
    Artisan::call("migrate", array(), new StreamOutput($stream));
    
    var_dump($stream);
    

    【讨论】:

      【解决方案3】:

      所有命令的返回结果定义在类Symfony\Component\Console\Command\Command,方法run

      return is_numeric($statusCode) ? (int) $statusCode : 0;
      

      $statusCode 变量是通过调用命令的execute 方法设置的,在工匠的情况下,该方法在类Illuminate\Console\Command 中定义:

      protected function execute(InputInterface $input, OutputInterface $output)
      {
          return $this->fire();
      }
      

      fire 方法的结果由各个命令决定,在php artisan migrate 命令的情况下,该方法不返回任何内容,因此$statusCode 为空(这就是返回 0 的原因来自Symfony\Component\Console\Command\Command::run方法)

      如果您想从自定义命令返回响应,只需从您的 fire 方法返回一个整数,它就会冒泡回到 $statusCode。您可以使用它以编程方式切换自定义命令的不同结果。

      如果您特别想从 artisan:migrate 命令中获取结果,那么我认为除了将命令包装在调用它的自定义命令中之外,您可以做很多事情来更改返回值。

      【讨论】:

      • Symfony 这样做的原因是UnixUnix-like 系统的工作方式。如果命令返回 0,则表示它成功,而如果它返回任何其他数字,则表示它失败,并且特定数字对应于可能是也可能不是其公共 API 的一部分的状态代码。我不确定如果响应不是整数会发生什么,但我认为要么行为未定义,要么系统应该表现得好像命令返回 0。
      • @trysis 如果要返回字符串或数组,结果将是0
      【解决方案4】:

      是的,这是可能的。要从自定义命令中获取内置 artisan 命令的输出,请将命令中的 OutputStream 传递到 Artisan::call。示例:

      class MyCommand extends \Illuminate\Console\Command
      {
          public function fire()
          {
              \Artisan::call('optimize', [], $this->getOutput());
          }
      }
      

      【讨论】:

      • 请原谅我对 PHP 的明显无知,但工匠呼吁之前的反斜杠是什么?
      • @trysis:反斜杠完全限定了namespaceArtisan 在全局命名空间中:MyCommand 可能不在。
      【解决方案5】:

      迟到但可能对搜索用例的人有用。

      让我添加我在测试中的操作方式,以将结果打印到控制台。我的问题是在测试运行迁移时打印输出。我正在使用模块,想看看迁移过程的结果。

      $this->artisan('module:migrate');
      //same as running php artisan module:migrate or
      // $this->app['Illuminate\Contracts\Console\Kernel']->call('module:migrate');
      
      echo $this->app['Illuminate\Contracts\Console\Kernel']->output();
      

      【讨论】:

        【解决方案6】:

        当您想要的 Artisan 命令输出发出 echo 时。

        您可以使用ob_startob_get_clean 访问此类输出。

        例如,如果您的命令回显 JSON。

        Artisan::command('myecho:command', function () {
        
            echo json_encode(config('myconfig'), true);
        
        })->describe('outputs json');
        

        然后您可以通过将命令调用包装在缓冲区中来访问 JSON 输出:

        \ob_start();
        \Artisan::call('myecho:command');
        $output = \ob_get_clean();
        
        var_dump($output);
        

        【讨论】:

          【解决方案7】:

          也许这会在未来为某人节省一些时间,对我来说,混合了 2 个答案:

          use Symfony\Component\Console\Output\StreamOutput;
          
          $stream = fopen("php://output", "w");
          Artisan::call('migrate', [
              '--path' => 'database/migrations/customer',
              '--force' => true,
              '--database' => $connectionName
          ], new StreamOutput($stream));
          
          $callResponse = ob_get_clean();
          

          StreamOutput 有助于将响应放入缓冲区和 ob 函数中以获取响应。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-04-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多