当我提交下面详细说明的表单时,我得到一个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();
}
}
}
?>
答案 0 :(得分:1)
对于RESTful Controllers,您应该使用route
方法定义Route::controller
,即
Route::controller('ask', 'QuestionsController');
和controller methods
应该以{{1}}为前缀,例如,您可能会使用http verb
而postCreate
代替post_create
,因此它看起来不像Restful
像一个public $restful = true;
控制器。
您在控制器中使用Laravel-4
,public $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...
}