php重定向到laravel中的另一个页面

时间:2014-03-10 07:07:28

标签: laravel

我在前端有一个模态视图(来自bootstrap的视图)。

单击提交按钮后,用户将转到控制器中的功能:

Route::post('post_question', array('uses' => 'QuestionController@postQuestion'));

在postQuestion结束时,我想重定向到另一个页面。

我试过了:

return Redirect::to('mywebsite/question/1');
return Response::make( '', 302 )->header( 'Location', 'mywebsite/question/1' );
return Redirect::route('question/'.$question_id)->with("question",Question::find($question_id));
header("Location: mywebsite/question/$question_id");

似乎没有工作。

问题是,我可以在XHR中看到请求,但只是页面未被重定向。 模态是否以某种方式阻止了这种行为?

2 个答案:

答案 0 :(得分:1)

您可以使用AJAX请求重定向。但是,您会发现结果不符合您的预期。

在重定向上,Laravel会将您的响应代码标头设置为重定向响应,然后将发送重定向页面的内容。

根据你想要处理事情的方式,你可以做两件事之一。

  1. 使用元数据参数将JSON响应发送回提交的表单,然后在成功函数中使用此元数据来设置window.location
  2. 你的Laravel控制器响应帖子看起来有点像这样:

    public function postQuestion()
    {
        // DO stuff to set your $question
    
        return [
            'question' => $question,
            'meta' => [
                'redirect_url' => url('mywebsite/question/'.$question->id),
                'status' => '400',
                // Any other meta data you may want to send
            ],
        ];
    }
    

    然后假设您正在进行一些jQuery AJAX调用,请更改您的成功回调(我在这里称之为questionSubmitSuccess):

    questionSubmitSuccess = function (data) {
        // Anything you may want to do before redirecting the user
    
        if (data.meta.redirect_url) {
            // This redirects the page
            window.location = data.meta.redirect_url;
        }
    }
    
    1. 继续从您的控制器重定向,然后做一些类似于rails turbo链接的东西并用Javascript替换整个页面:
    2. 您可以通过以下几种方式执行此操作:使用[Modify the URL without reloading the page浏览器历史记录API),或使用jQuery.load提交表单。

      浏览器历史记录API可能会更容易,因为它仍然允许您处理响应错误,但它只适用于更现代的浏览器。 jQuery.load可能需要重写一些你的AJAX提交代码,并且更难处理错误之类的东西(它将替换你的页面内容,无论我能告诉你的状态代码),但它有更好的浏览器支持。


      IMO,第一种方法更具有操作性,因为API端点可以通过除此单一实现之外的其他方式使用。 此外,与尝试在没有页面重新加载的情况下替换整个DOM相比,管理的故障点和错误状态更少。

答案 1 :(得分:0)

你可以将按钮放在窗体内,当你提交该按钮将数据从页面传递给控制器​​时,从控制器调用带有该数据的另一页面 比如返回View :: make('users.index,compact('data'));