Laravel:从URL历史记录中排除路由

时间:2019-03-24 16:00:50

标签: php laravel

我有一条路由可以响应来自私有存储的图像-但仅适用于授权用户。这是因为出于安全原因,它们不能在公共存储中。

现在我有一个表单(使用Blade),其中这些图像被加载为当前值的小预览。当结果请求经过验证并出现错误时,Laravel的FormRequest类将重定向到$this->redirector->getUrlGenerator()->previous()

由于图像是在表单之后加载的,因此用户将被重定向到图像URL而不是表单,在表单URL中将显示验证错误。

我的问题:

如何从URLGenerator的历史记录中排除一条特定的路由,以使->previous()调用不会返回图像URL,而是返回表单的URL?

谢谢:)

3 个答案:

答案 0 :(得分:1)

我找到了解决我的问题的方法-在我看来-比先前提出的答案更好。

我在Kernel类中创建了一个新的中间件组,在其中用替换了\Illuminate\Session\Middleware\StartSession::class方法的扩展类替换了中间件handle。我的方法基本上与原始方法相同,但是不调用$this->storeCurrentUrl($request, $session);

这样,带有该中间件组的任何路由都不会添加到Laravel的URL历史记录中。接下来,我在RouteServiceProvider中注册了一个使用新的中间件组的新路由组。

这样,由于所有存储路由都不会包含在URL历史记录中,因此Laravel可以默认重定向到先前的URL。

答案 1 :(得分:1)

我面临着完全相同的挑战,即通过一个与Laravel的URL历史记录混淆的控制器从Amazon S3请求图像。我想出了以下“ hacky”一线客:

request()->headers->set('X-Requested-With', 'XMLHttpRequest');        

当此行出现在图像服务控制器中时,storeCurrentUrl()中的setPreviousUrl()将不会被调用。我向laravel注册了一个名为“ silent”的新中间件,以便可以在web.php的路由中以更简单的方式使用它。

答案 2 :(得分:0)

  • 您不应依赖于以前从站点生成的URL。我认为这是一个不好的做法。

    • 假设您在一个页面上有一个简单表单,而在另一页面上有另一个简单表单(用户在另一个选项卡中打开了该表单)。现在,如果稍后再提供后者,并且用户正在填写第一个表单,那么您将在页面的第二个表单上显示第一个表单错误,这是非常不希望的。
  • 最佳选择是利用命名路线。您不必再依赖于URL路由历史记录,并且可以可靠地将用户重定向到表单路由本身。我假设您使用的是命名路由,即为路由命名。像下面这样-

路线:

<?php

Route::get('/your-form-route',['as' => 'form-name-route','uses' => 'SomeController@someMethod']);

控制器方法:(提交表单后)

<?php

class SomeController{
 public function processInput(Request $request){
   $validator = Validator::make(.....);

   ....
   ....
   if($validator->fails())
        return redirect()->route('form-name-route')->withErrors($validator->errors())->withInput();
   }
}