Laravel 5:在POST请求上重定向到外部链接

时间:2016-07-03 10:38:43

标签: php laravel laravel-5

通过POST请求调用以下函数。我需要从我的数据库中检索URL并在新选项卡中打开该链接。我正在使用Redirect::away()功能。但它给出MethodNotAllowedHttpException。我试过在GET请求中调用此函数,它完全正常。

public function generateURL(Request $request) {

    $screenRow = \App\ScreenshotRow::find($request->input('row_ID'));
    $baseURL = $screenRow->BaseURL;

    $screenshot = \App\Screenshot::where('Setname', '=', $screenRow->Setname)->get();
    $pageURL = $screenshot[0]['PageURL'];

    if ($baseURL == "") {
        return Redirect::away($PageURL);
    }

    else
        return Redirect::away($baseURL);
}

有没有办法在响应POST请求时调用此函数?

1 个答案:

答案 0 :(得分:1)

我只需使用Ajax表单并使用Javascript重定向用户。

确保您的表单为ID

<form id="myForm" method="POST" action="{{ route('your.route') }}">
...
...
<button type="submit">Submit the Form</button>

使此表单与Ajax一起使用

<script>
    $('#myForm [type="submit]').click(function(e){
        e.preventDefault();

        var form = jQuery(this).parents("form:first");
        var dataString = form.serialize();
        var formAction = form.attr('action');

        $.ajax({
            type: "POST",
            url : formAction,
            data : dataString,
            success : function(data){
                var url = $.parseJSON(data.responseText);
                console.log(data); 
                // Redirect to a new tab with the given url
                window.open(url.success, '_blank');
            },
            error : function(data){
                var error = $.parseJSON(data.responseText);
                console.log(error);
                // Do what ever you want with an Error Message
                alert(error)
            }
        },"json");
    });
</script>

好的 - 如果表单收到成功消息,则执行success函数,否则执行error函数。

让我们转到处理请求的后端控制器

public function generateURL(Request $request) {

    $screenRow = \App\ScreenshotRow::find($request->input('row_ID'));
    $baseURL = $screenRow->BaseURL;

    $screenshot = \App\Screenshot::where('Setname', '=', $screenRow->Setname)->get();
    $pageURL = $screenshot[0]['PageURL'];

    // Return a JSON Success Message with a Success HTTP Status Code
    if ($baseURL == "") {
        return response()->json(['success' => $PageURL], 200);
    }

    // Return a JSON Error Message with a Error HTTP Status Code
    else
        return response()->json(['error' => $baseURL], 400);
}

现在,如果您的后端抛出成功消息,则会调用Ajax表单的成功函数,该函数会根据您在后端控制器成功响应中传递的给定URL重定向到新选项卡。

注意

要避免Ajax请求上的tokenmismatchexception,您应该将csrf_token添加到meta中的<head>部分。

<meta name="csrf-token" content="{{ csrf_token() }}">

并在每个表单请求

上获取此csrf_token
$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});