Опитвам се да пусна нещо много елементарно. Свикнал съм с CI и сега уча Laravel 4, а техните документи не го правят лесно! Както и да е, опитвам се да създам формуляр за вход и просто да се уверя, че данните са публикувани успешно, като ги отпечатам в следващия формуляр. Получавам това изключение:
Symfony \ Component \ HttpKernel \ Exception \
MethodNotAllowedHttpException
и моят MemberController.php:
public function index()
{
if (Session::has('userToken'))
{
/*Retrieve data of user from DB using token & Load view*/
return View::make('members/profile');
}else{
return View::make('members/login');
}
}
public function validateCredentials()
{
if(Input::post())
{
$email = Input::post('email');
$password = Input::post('password');
return "Email: " . $email . " and Password: " . $password;
}else{
return View::make('members/login');
}
}
и маршрути има:
Route::get('/', function()
{
return View::make('hello');
});
Route::get('/members', 'MemberController@index');
Route::get('/validate', 'MemberController@validateCredentials');
и накрая моят изглед login.php има тази посока на формата:
<?php echo Form::open(array('action' => 'MemberController@validateCredentials')); ?>
Всяка помощ ще бъде високо оценена.
Получавате тази грешка, защото изпращате към маршрут GET
.
Бих разделил маршрутизацията ви за validate
на отделни маршрути GET
и POST
.
Нови маршрути:
Route::post('validate', 'MemberController@validateCredentials');
Route::get('validate', function () {
return View::make('members/login');
});
Тогава методът на вашия контролер може да бъде просто
публична функция validateCredentials()
{
$email = Input::post('email');
$password = Input::post('password');
return "Email: " . $email . " and Password: " . $password;
}
Подозирам, че проблемът е в дефиницията на маршрута.
Дефинирали сте маршрута като заявка GET
, но формулярът вероятно изпраща заявка POST
. Променете дефиницията на маршрута.
Route::post('/validate', 'MemberController@validateCredentials');
Като цяло е по-добра практика да се използват именувани маршрути (помага за мащабиране, ако методът/класът на контролера се промени).
Route::post('/validate', array(
'as' => 'validate',
'uses' => 'MemberController@validateCredentials'
));
Във формуляра използвайте следното
<?php echo Form::open(array('route' => 'validate')); ?>
<?php echo Form::open(array('action' => 'MemberController@validateCredentials')); ?>
по подразбиране Form::open()
предполага метод POST
.
имате GET
в маршрутите си. променете го на POST
в съответния маршрут.
или ако искате да използвате метода GET
, тогава добавете параметъра method
.
напр.
Form::open(array('url' => 'foo/bar', 'method' => 'get'))