从artisan命令重定向到URL

时间:2017-03-25 20:03:28

标签: php laravel redirect laravel-5.4

我正在使用Laravel 5.4。我有一个通常由cron运行的工匠命令,但它也可以由用户在网站内运行。用户在页面/customer/123上,然后点击一个带有/customer/vat/123链接的按钮,artisan命令完成其工作并应将浏览器重定向回/customer/123,但不是出于某种原因。
我的路线看起来像这样:

Route::get('customer/vat/{id}', function ($id) {
    Artisan::call('app:reminder', [
        '--vat' => $id
    ]);
});

整个事情按预期运行只是重定向什么也没做。日志中没有任何错误消息,只是一个空白页。

在最底层的工匠指令中,我有:

return redirect::to('/customer/123');

我希望只是将我重定向到上面的网址,但事实并非如此。

我是否需要使用其他功能从artisan命令中重定向?

2 个答案:

答案 0 :(得分:5)

首先,你的工匠命令会返回一些东西,但你在路线封闭中没有返回任何东西。很明显,结果将是空的。

其次,即使您说return Artisan::call('...');它也不会起作用,因为call方法返回控制台命令的退出状态,而不是http://answers.unity3d.com/questions/45892/unity-unit-scale.html返回的输出。 1}}工匠命令的方法。

最后,Artisan命令永远不会返回handle。想一想,为什么工匠命令会返回视图? Artisan命令是控制台命令,并不是要将view返回responses。你有控制器

要解决此问题,您可以执行以下操作:

requests

然后从artisan命令句柄方法中删除Route::get('customer/vat/{id}', function ($id) { Artisan::call('app:reminder', [ '--vat' => $id ]); return redirect()->to('/customer/123'); });

答案 1 :(得分:0)

我同意Paras的分析,这对Artisan命令来说有点尴尬。我认为'正确'处理这种情况的方法是将命令类中的功能抽象为一个全新的类,命令和端点都可以转向大部分繁重的工作。

但是,如果由于某种原因这不可行,您可以使命令输出用于重定向的URI。正如帕拉斯所提到的那样,对于return来自Artisan命令的东西来说它是无用的,而且我还会给echo他们添加一些不好的做法。而是使用Command方法将字符串发送到您配置的任何输出缓冲区。 $this->info($yourRedirectUrI);

最后,要使端点闭包看到该输出,请使用Artisan::output()方法:

Route::get('customer/vat/{id}', function ($id) {
    Artisan::call('app:reminder', [
        '--vat' => $id
    ]);
    redirect(Artisan::output());
});