Laravel throwing MethodNotAllowedHttpException
Я пытаюсь получить что-то очень простое. Я привык к 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', '[email protected]');
Route::get('/validate', '[email protected]');
и, наконец, мой вид login.php имеет это направление формы:
<?php echo Form::open(array('action' => '[email protected]')); ?>
Любая помощь будет принята с благодарностью.
Ответы
Ответ 1
Вы получаете эту ошибку, потому что отправляете по маршруту GET
.
Я бы разделил ваш маршрут для validate
на отдельные маршруты GET
и POST
.
Новые маршруты:
Route::post('validate', '[email protected]');
Route::get('validate', function () {
return View::make('members/login');
});
Тогда ваш метод контроллера может быть просто
public function validateCredentials()
{
$email = Input::post('email');
$password = Input::post('password');
return "Email: " . $email . " and Password: " . $password;
}
Ответ 2
Я подозреваю, что проблема заключается в определении вашего маршрута.
Вы определили маршрут как запрос GET
, но форма, вероятно, отправляет запрос POST
. Измените определение маршрута.
Route::post('/validate', '[email protected]');
Как правило, лучше использовать именованные маршруты (помогает масштабировать при изменении метода/класса контроллера).
Route::post('/validate', array(
'as' => 'validate',
'uses' => '[email protected]'
));
В форме используйте следующее
<?php echo Form::open(array('route' => 'validate')); ?>
Ответ 3
Проблема в том, что вы используете POST
, но на самом деле вы должны выполнить PATCH
Чтобы это исправить, добавьте
<input name="_method" type="hidden" value="PATCH">
Сразу после строки Form::model
Ответ 4
Я также столкнулся с этой проблемой, и другие ответы здесь были полезны, но я использую Route::resource
, который заботится о GET
, POST
и других запросах.
В моем случае я оставил свой маршрут как есть:
Route::resource('file', 'FilesController');
И просто изменил мою форму для отправки в функцию store
в моем FilesController
{{ Form::open(array('route' => 'file.store')) }}
Это устранило проблему, и я подумал, что стоит указать в качестве отдельного ответа, поскольку различные другие ответы предлагают добавить новый маршрут POST
. Это вариант, но это не обязательно.
Ответ 5
Это потому, что вы публикуете данные в маршрут GET
.
Route::get('/validate', '[email protected]');
попробуйте это
Route::post('/validate', '[email protected]');
Ответ 6
Обычно MethodNotAllowedHttpException
происходит, когда
Метод маршрута не совпадает.
Предположим, вы определяете файл маршрута запроса POST
, но отправляете запрос маршрута GET
.
Ответ 7
<?php echo Form::open(array('action' => '[email protected]')); ?>
по умолчанию Form::open()
предполагает метод POST
.
у вас есть GET
в ваших маршрутах. замените его на POST
на соответствующем маршруте.
или если вы хотите использовать метод GET
, добавьте параметр method
.
например,
Form::open(array('url' => 'foo/bar', 'method' => 'get'))
Ответ 8
Я столкнулся с ошибкой,
проблема была в методе форм
{{ Form::open(array('url' => 'admin/doctor/edit/'.$doctor->doctor_id,'class'=>'form-horizontal form-bordered form-row-stripped','method' => 'PUT','files'=>true)) }}
Это должно быть так
{{ Form::open(array('url' => 'admin/doctor/edit/'.$doctor->doctor_id,'class'=>'form-horizontal form-bordered form-row-stripped','method' => 'POST','files'=>true)) }}
Ответ 9
В моем случае я отправлял запрос POST
через HTTP
на сервер, где я настроил Nginx
для перенаправления всех запросов на порт 80
на порт 443
, где я обслуживал приложение через HTTPS
.
Выполнение запроса к правильному порту напрямую устранило проблему. В моем случае все, что мне нужно было сделать, это заменить http://
в URL-адресе запроса на https://
, поскольку я использовал порты по умолчанию 80
и 443
соответственно.
Ответ 10
Как правило, существует ошибка в используемом глаголе HTTP, например:
Вызов маршрута PUT
с запросом POST
Ответ 11
Моя проблема была не в том, что мои маршруты были настроены неправильно, а в том, что я ссылался на неправильный метод Form
(который я скопировал из другой формы). Я делал...
{!! Form::model([ ... ]) !!}
(без указания модели). Но я должен был использовать обычный метод open
...
{!! Form::open([ ... ]) !!}
Поскольку первый параметр, который model
ожидает реальной модели, он не получал ни одного из моих параметров, которые я указывал. Надеюсь, это поможет кому-то, кто знает, что их маршруты верны, но что-то еще не так.
Ответ 12
У меня также была та же ошибка, но у меня было другое исправление, в моем XYZ.blade.php
у меня было:
{!! Form::open(array('ul' => 'services.store')) !!}
который дал мне ошибку, - я все еще не знаю why-, но когда я изменил ее на
{!! Form::open(array('route' => 'services.store')) !!}
Это сработало!
Я думал, что стоит поделиться :)
Ответ 13
хорошо, когда у меня были эти проблемы, я столкнулся с 2 ошибками кода
{!! Form::model(['method' => 'POST','route' => ['message.store']]) !!}
я исправил это, сделав это
{!! Form::open(['method' => 'POST','route' => 'message.store']) !!}
так что просто для расширения я изменил model
формы, чтобы open
а также маршрут, где неправильно размещены в квадратных скобках.
Ответ 14
Laravel иногда не поддерживает {!! Form::open(['url' => 'posts/store']) !!}
{!! Form::open(['url' => 'posts/store']) !!}
по соображениям безопасности. Вот почему произошла ошибка. Вы можете решить эту ошибку, просто заменив приведенный ниже код
{!! Form::open(array('route' => 'posts.store')) !!}
Код ошибки {!! Form::open(['url' => 'posts/store']) !!}
{!! Form::open(['url' => 'posts/store']) !!}
Правильный код {!! Form::open(array('route' => 'posts.store')) !!}
{!! Form::open(array('route' => 'posts.store')) !!}
Ответ 15
В моем случае это было потому, что моя форма отправлялась по маршруту с другим промежуточным программным обеспечением. Поэтому он заблокирован от отправки информации по этому конкретному маршруту.
Ответ 16
В Laravel 5.7 или позже
шаги:
- Перейдите в \app\Http\Middleware\VerifyCsrfToken.
- Добавьте ваш URL в виде строки в $, кроме.
Пример:
protected $except = [
'/your-url-withput-csrf-token'
];
Ответ 17
// not done
Route::post(''/posts/{id}'', '[email protected]')->name('posts.store');
return redirect(''/posts'')->with('status','Post was created !');
// done
Route::post(''/posts'', '[email protected]')->name('posts.store');
return redirect(''/posts'')->with('status','Post was created !');