我正在尝试从我的服务类重定向。我不想将url返回给调用者,因为它不是直接从控制器访问的,并且在某些情况下它应该返回其他数据。 但是我发现我可以这样重定向:
Redirect::away('http://someexternalurl.com')->send();
这似乎工作正常 - 用户被重定向到我输入的网址。问题是,在这种情况下,应用程序“依赖”,以便执行以下命令。那不是我需要的。
如果我die();
之后我的会话更改似乎没有被“保存”。
有没有办法进行重定向并在此之后立即停止应用而不是简单地“杀死”它?
基本上有一种方法可以重写这段代码
Session::forget('myval');
Redirect::away('http://someexternalurl.com')->send();
mail('my@mail.com', 'Test', 'Still running');
因此myval将从会话中消失,用户将被重定向到url并且不会发送邮件(实际上任何重定向都不应该被执行)?
谢谢
答案 0 :(得分:2)
这是Laravel 5.2的解决方案。我估计它将全部工作。*
abort(301, '', ['Location' => 'http://antondukhanin.ru']);
methodThatWouldntBeExecuted();
该函数抛出HttpException,因此将中断任何下一个命令的执行
答案 1 :(得分:1)
看起来你只需要重新定位Redirect?
return Redirect::away('http://someexternalurl.com')->send();
答案 2 :(得分:1)
解决方案是抛出异常并改写异常处理程序的render
方法。
在您的控制器中:
// app/Controllers/DashboardController.php
public function index()
{
\App\Services\Test::test();
return view('dashboard');
}
我的示例服务:
// app/Services/Test.php
<?php
namespace App\Services;
class Test {
public static function test() {
throw new \App\Exceptions\TestException('test');
}
}
在您的异常处理程序中:
// app/Exceptions/Handler.php
public function render($request, Exception $exception)
{
if ($exception instanceof TestException) {
return redirect(url('/?error=' . $exception->getMessage()));
}
return parent::render($request, $exception);
}
我的示例Exception(可以随意命名),只需要扩展默认的Exception。
<?php
namespace App\Exceptions;
class TestException extends \Exception {
}