Laravel:通过控制器传递数据会导致MethodNotAllowedHttpException

时间:2016-05-03 20:20:47

标签: php laravel

我看过this帖子,但我不相信这与我的问题有关,因为我相信我通过邮寄路线正确传递了帖子数据。

以下是相关的路线代码:

Route::get('/pass', 'PageController@pass');
Route::post('/pass/{request}',['uses' => 'PageController@passController']);

我想有一个控制器方法来传递'页面,但为了隔离问题,我将它们分开了。

以下是PageController.php中的相关方法:

public function pass(){

    return view('pass')->with(array(
        'title'=>'Create A Pass'
    ));



}
public function passRequest($request){
    $data['request'] = $request;
    $validator = Validator::make($request->all(), [
        'studentID' => 'required|max:255',
        'teacherID' => 'required|max:255',
        'destination' => 'required|max:255',
    ]);
    if ($validator->fails()) {
        return redirect('/')
            ->withInput()
            ->withErrors($validator);
    }
    $pass = new Pass;
    $pass->student = DB::table('users')->where('studentID', $request->studentID)->first()->id;
    $pass->teacher = DB::table('users')->where('teacherID', $request->teacherID)->first()->id;
    $pass->destination = $request->destination;
    $pass->save();
    return view('home')->with(array(
        'title'=>'Home',
        'success'=>'null'
    ));
}

我使用了here所述的方法,以便将数据传递给控制器​​。如果这是不好的做法/过时,我可以接受任何建议。

这是'传递中的表格。负责发送帖子数据的页面

<form action="{{ url('pass') }}" method="POST" class="form-horizontal">

        {!! csrf_field() !!}
        <fieldset>
            <!-- Text input-->
            <div class="container">
                <div class="form-group">
                    <label class="col-md-4 control-label" for="studentID">Student ID</label>
                    <div class="col-md-3">
                        <input id="studentID" name="studentID" type="text" class="form-control input-md">
                    </div>
                </div>
            </div>
            <!-- Text input-->
            <div class="container">
                <div class="form-group">
                    <label class="col-md-4 control-label" for="teacherID">Teacher ID</label>
                    <div class="col-md-3">
                        <input id="teacherID" name="teacherID" type="text" class="form-control input-md">
                    </div>
                </div>
            </div>
            <!-- Text input-->
            <div class="container">
                <div class="form-group">
                    <label class="col-md-4 control-label" for="destination">Destination</label>
                    <div class="col-md-3">
                        <input id="destination" name="destination" type="text" class="form-control input-md">
                    </div>
                </div>
            </div>
            <div class="container">
                <div class="form-group">
                    <div class="col-sm-offset-4 col-sm-6">
                        <button type="submit" class="btn btn-default">
                            <i class="fa fa-check"></i> Create Pass
                        </button>
                    </div>
                </div>
            </div>
        </fieldset>
</form>

提交此表单后,我收到MethodNotAllowedHttpException异常。

如果错误的堆栈跟踪有帮助,请告诉我。如果对风格有任何建议,我也可以这样做。

3 个答案:

答案 0 :(得分:2)

此表单标记将生成对网址/pass的POST请求:

<form action="{{ url('pass') }}" method="POST" class="form-horizontal">

您的路线文件不允许这样做。它只允许GET请求到该URL,但POST请求/pass/{request}

不确定它是否只是一个复制/粘贴错误,但您的POST路由设置为调用PageController@passController方法,但您从控制器共享的方法名为passRequest。那些也需要匹配。

答案 1 :(得分:2)

除了Jeff Lambert所指出的,你不应该将{request}变量放在路线中。

你应该删除它并让laravel为你注入Request对象。

如果您还没有在课程顶部,请导入Request课程。

use Illuminate\Http\Request;

您的功能应如下所示......

public function passRequest(Request $request)
{
    ...
}

如果您有其他参数来传递URL,那么您可以将它们添加到路径中,并在Request $request之后将参数添加到方法中。 Laravel将弄清楚如何处理它。

答案 2 :(得分:0)

尝试这个...

Route::post('/pass/post','PageController@passController')->name('post_insert');
在您的html表单中

更改为...

<form action="{{ route('post_insert') }}" method="POST" class="form-horizontal">

也更改它...

public function passRequest(Illuminate\Http\Request $request){
....