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


Laravel: Passing data through a controller results in MethodNotAllowedHttpException

我看过这篇文章,但我认为它与我的问题无关,因为我相信我通过帖子路由正确地传递了帖子数据。

这是相关的路线代码:

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

我想为"pass"页面提供一个控制器方法,但为了隔离问题,我将它们分开。

以下是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'
    ));
}

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

这是"通行证"页面中负责发送邮寄数据的表格

<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异常。

如果堆栈跟踪错误会有所帮助,请告诉我。如果有任何关于风格的建议,我也持开放态度。

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

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

您的路由文件不允许这样做。它只允许对该url进行GET请求,但允许对/pass/{request}进行POST请求。

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

除了Jeff Lambert指出的之外,您不应该将{request}变量放在路由中。

您应该移除它,并让laravel为您注入Request对象。

如果您还没有处于类的顶部,请导入Request类。

use Illuminate'Http'Request;

你的函数应该如下所示。。。

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

如果您有额外的参数要通过URL传递,那么您可以将它们添加到路由中,并在Request $request之后将参数添加到方法中。Laravel会想办法处理它。

试试这个。。。

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){
....