Laravel 4 MethodNotAllowedhttpException

时间:2013-09-13 18:55:31

标签: laravel laravel-4

当我提交下面详细说明的表单时,我得到一个MethodNotAllowedHttpException。这条路线对我来说是正确的,并且在语法上与其他正常工作的路线相同。控制器方法存在,但即便如此,我认为异常是在请求到达控制器之前发生的,因为laravel错误页面左侧的项目4在第3项后面的readRoute说明了handleRoutingException。我很确定我没有像你在laravel 4中那样使用restful routing,但那是因为我正在学习laravel 3教程并将hte语法更新为4,因为我去了,但就像我说其他路由工作正常所以我无法弄清楚为什么不这样做。

模板

@extends('layouts.default')

@section('content')
<div id="ask">
    <h1>Ask a Question</h1>

    @if(Auth::check())
        @include('_partials.errors')

        {{ Form::open(array('ask', 'POST')) }}

        {{ Form::token() }}

        <p>
            {{ Form::label('question', 'Question') }}
            {{ Form::text('question', Input::old('question')) }}

            {{ Form::submit('Ask a Question') }}

        </p>

        {{ Form::close() }}
    @else

    <p>

        <p>Please login to ask or answer questions.</p>

    </p>
    @endif



</div><!-- end ask -->
@stop

路线

Route::post('ask', array('before'=>'csrf', 'uses'=>'QuestionsController@post_create'));

控制器

<?php

class QuestionsController extends BaseController {

    public $restful = true;
    protected $layout = 'layouts.default';

    public function __construct()
    {
        $this->beforeFilter('auth', array('post_create'));
    }

    public function get_index() {
        return View::make('questions.index')
            ->with('title', 'Make It Snappy Q&A - Home');
    }

    public function post_create()
    {
        $validation = Question::validate(Input::all());

        if($validation->passes()) {
            Question::create(array(
                'question'=>Input::get('question'),
                'user_id'=>Auth::user()->id
            ));

            return Redirect::Route('home')
            ->with('message', 'Your question has been posted.');

        } else {
            return Redirect::Route('register')->withErrors($validation)->withInput();
        }
    }


}
?>

2 个答案:

答案 0 :(得分:1)

对于RESTful Controllers,您应该使用route方法定义Route::controller,即

Route::controller('ask', 'QuestionsController');

controller methods应该以{{1​​}}为前缀,例如,您可能会使用http verbpostCreate代替post_create,因此它看起来不像Restful像一个public $restful = true;控制器。

您在控制器中使用Laravel-4public $restful = true;未使用{{1}},{{1}}可能会导致此问题,因此请删除此行。

答案 1 :(得分:1)

我相信定义public $restful = true;是如何在Laravel 3中完成的。在Laravel 4中,你在路线中定义一个宁静的控制器,如下所示:

Route::controller('ask', 'QuestionsController');

然后定义函数,不要使用下划线来分隔它们。你必须像这样使用骆驼案:

public function getIndex()
{
    // go buck wild...
}

public function postCreate() 
{
    // do what you do...
}