Laravel 4 提交表单后,重定向回Laravel中的上一页

Laravel 4 提交表单后,重定向回Laravel中的上一页,laravel-4,Laravel 4,我有一个通过Route::controller()路由的控制器 我有一个getEdit和一个postEdit功能。我正在从不同的位置链接到getEdit-函数,希望用户在表单中进行更改并提交后重定向到该位置 成功保存到数据库后,我使用了Redirect::back()方法,但不幸的是,在getEdit之前,我没有被重定向到请求的页面,而是返回到getEdit 我有可能改变这种行为吗?在搜索和尝试之后,我找到了一个解决方案,它似乎非常适合我的场景,对我来说也非常干净 在我的getEdit函数中将会

我有一个通过
Route::controller()
路由的控制器

我有一个
getEdit
和一个
postEdit
功能。我正在从不同的位置链接到
getEdit
-函数,希望用户在表单中进行更改并提交后重定向到该位置

成功保存到数据库后,我使用了
Redirect::back()
方法,但不幸的是,在
getEdit
之前,我没有被重定向到请求的页面,而是返回到
getEdit


我有可能改变这种行为吗?

在搜索和尝试之后,我找到了一个解决方案,它似乎非常适合我的场景,对我来说也非常干净

在我的
getEdit
函数中将会话键
URL.designed
设置为
URL::previous()
,而不是使用URL参数或任何类似的参数

Session::put('url.intended', URL::previous());  // using the Facade
session()->put('url.intended', URL::previous(); // using the L5 helper
在我的
postEdit
函数中,我只需执行一个
return Redirect::designed('/')


工作起来很有魅力,完全解决了我的问题。

在搜索和尝试之后,我找到了一个解决方案,它似乎非常适合我的场景,对我来说也非常干净

在我的
getEdit
函数中将会话键
URL.designed
设置为
URL::previous()
,而不是使用URL参数或任何类似的参数

Session::put('url.intended', URL::previous());  // using the Facade
session()->put('url.intended', URL::previous(); // using the L5 helper
在我的
postEdit
函数中,我只需执行一个
return Redirect::designed('/')


工作起来很有魅力,完全解决了我的问题。

要在Tim的答案中添加一个使用Laravel 5的示例:

在具有编辑窗体的控制器方法中:

Session::put('requestReferrer', URL::previous());
这将把链接到编辑表单的上一页的URL存储为会话var
requestreferer

要使更新方法重定向回此变量,请执行以下操作:

return redirect(Session::get('requestReferrer'));

我假设如果用户同时打开多个表单,那么这可能不会给出预期的行为。如果有人建议进行更好的修订,我会编辑这篇文章,将其包括在内。

要在Tim的回答中添加一个使用Laravel 5的示例:

在具有编辑窗体的控制器方法中:

Session::put('requestReferrer', URL::previous());
这将把链接到编辑表单的上一页的URL存储为会话var
requestreferer

要使更新方法重定向回此变量:

return redirect(Session::get('requestReferrer'));

我假设如果用户同时打开多个表单,那么这可能不会给出预期的行为。如果有人建议进行更好的修订,我将编辑此文章以将其包括在内。

您也可以通过中间件执行此操作:

<?php

namespace Kjjdion\Larapack\Http\Middleware;

use Closure;

class IntendUrl
{
    public function handle($request, Closure $next)
    {
        // set intended url for redirect
        $request->session()->put('url.intended', $request->url());

        return $next($request);
    }
}

您也可以通过中间件执行此操作:

<?php

namespace Kjjdion\Larapack\Http\Middleware;

use Closure;

class IntendUrl
{
    public function handle($request, Closure $next)
    {
        // set intended url for redirect
        $request->session()->put('url.intended', $request->url());

        return $next($request);
    }
}


在编辑之前将url作为param传递给控制器怎么样?我也想到了这一点。但它必须是一个查询字符串(如
/edit/11?back=route/to/action
)才能工作,对吗?编辑。如果它仍然不是它,我不知道…在编辑之前把url作为param传递给控制器怎么样?我也想到了。但它必须是一个查询字符串(如
/edit/11?back=route/to/action
)才能工作,对吗?编辑。如果它仍然不是它,我不知道…谢谢你的回答,但是除了我的答案,我看不到相关性?在您的解决方案中(这也不是特定于L5的),您也不能使用预期的重定向。如果会话不存在怎么办?您将收到一个错误。很抱歉,我没有意识到url.INVENTED是为INVENTED()方法保留的。我的目的是澄清您给出的示例在做什么,通过尝试这样做,您的示例实际上在做什么!我看它有一个后备机制。我稍后会删除这个答案。会话必须处于活动状态才能工作是吗?我现在看到了我最初的实现错误,我错过了Facade中使用“预定”的拼写错误>。感谢您的回答,但除了我的回答之外,我看不到相关性?在您的解决方案中(这也不是特定于L5的),您也不能使用预期的重定向。如果会话不存在怎么办?您将收到一个错误。很抱歉,我没有意识到url.INVENTED是为INVENTED()方法保留的。我的目的是澄清您给出的示例在做什么,通过尝试这样做,您的示例实际上在做什么!我看它有一个后备机制。我稍后会删除这个答案。会话必须处于活动状态才能工作是吗?我现在看到了我最初的实现错误,我错过了Facade中用于“预期”的输入错误。输入错误(将t替换为d)让我停留一分钟应该是
session::put('url.designed',url::previous())如果表单中存在任何验证错误怎么办?用户将被重定向到同一页面,并且同一页面存储在会话中。还尝试编辑答案以添加缺少的结束括号,但显然编辑必须至少为6个字符!我想我的最后一点可以做到:
$hasrerrors=Session()->has('errors');如果($hasErrors===false){session()->put('url.designed',url::previous());}
在将预期url放入会话之前,当然要进行验证。让我输入一分钟的打字错误(用d替换t)应该是
session::put('url.designed',url::previous())如果表单中存在任何验证错误怎么办?用户将被重定向到同一页面,并且同一页面存储在会话中。还尝试编辑答案以添加缺少的结束括号,但显然编辑必须至少为6个字符!我想我的最后一点可以做到:
$hasrerrors=Session()->has('errors');如果($hasErrors===false){session()->put('url.designed',url::previous());}
在将预期url放入会话之前,当然会处理验证。