laravel бросает MethodNotAllowedHttpException

110

Я пытаюсь запустить что-то очень простое. Я привык к 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')); ?>

Любая помощь будет оценена.

spacemonkey
источник
В котором urlвы получаете ошибку?
DevO
Вы пробовали php artisan dump-autoload?
Andreyco
Старый пост, но люди все еще натыкаются на него - попробуйте "composer dump-autoload". Работал у меня.
Кирги
@Andreyco эта команда не определена.
Марсело Агимовель

Ответы:

198

Вы получаете эту ошибку, потому что отправляете сообщение по GETмаршруту.

Я бы разделил вашу маршрутизацию validateна отдельные GETи POSTмаршруты.

Новые маршруты:

Route::post('validate', 'MemberController@validateCredentials');

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;
}
конь
источник
25

Я подозреваю, что проблема заключается в определении вашего маршрута.

Вы определили маршрут как GETзапрос, но форма, вероятно, отправляет POSTзапрос. Измените определение маршрута.

Route::post('/validate', 'MemberController@validateCredentials');

Как правило, лучше использовать именованные маршруты (помогает масштабироваться при изменении метода / класса контроллера).

Route::post('/validate', array(
    'as' => 'validate',
    'uses' => 'MemberController@validateCredentials'
));

В форме используйте следующие

<?php echo Form::open(array('route' => 'validate')); ?>
Благословение
источник
23

Проблема в том, что вы используете, POSTно на самом деле вам нужно выполнить PATCH Чтобы исправить это, добавьте

<input name="_method" type="hidden" value="PATCH">

Сразу после Form::modelлинии

Эли
источник
1
в Laravel вы можете использовать {{ method_field('PATCH') }}в своем шаблоне.
Майкл Юсри
13

Это потому, что вы публикуете данные с помощью метода get.

Вместо того

Route::get('/validate', 'MemberController@validateCredentials');

Попробуй это

Route::post('/validate', 'MemberController@validateCredentials');
Minitechi
источник
Это правильно, может ли модератор дать правильный ответ, если пользователь этого не сделает? Это третий ответ и единственный правильный.
logos_164 09
12

Я столкнулся с этой проблемой , а также и другие ответы здесь были полезны, но я с помощью Route::resourceкоторой берет на себя GET, POSTи другие запросы.

В моем случае я оставил свой маршрут как есть:

Route::resource('file', 'FilesController');

И просто изменил мою форму, чтобы передать storeфункцию в моемFilesController

{{ Form::open(array('route' => 'file.store')) }}

Это устранило проблему, и я подумал, что стоит указать на это как отдельный ответ, поскольку в других ответах предлагается добавить новый POSTмаршрут. Это вариант, но не обязательно.

Дэн
источник
9

Обычно MethodNotAllowedHttpExceptionбывает, когда

метод маршрута не совпадает.

Предположим, вы определяете POSTфайл маршрута запроса, но отправляете GETзапрос в маршрут.

коушер алам пранто
источник
7
<?php echo Form::open(array('action' => 'MemberController@validateCredentials')); ?>

по умолчанию Form::open()предполагает POSTметод.

у вас есть GETв ваших маршрутах. измените его на POSTв соответствующем маршруте.

или если вы хотите использовать GETметод, добавьте methodпараметр.

например

Form::open(array('url' => 'foo/bar', 'method' => 'get'))
Итачи
источник
4

Я столкнулся с ошибкой,
проблема заключалась в СПОСОБЕ ФОРМЫ

{{ 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)) }}
Фарук Омар
источник
4

В моем случае я отправлял POSTзапрос HTTPна сервер, на котором я настроил Nginxперенаправление всех запросов на порт 80на порт, 443где я обслуживал приложение HTTPS.

Выполнение запроса к правильному порту напрямую устранило проблему. В моем случае все, что мне нужно было сделать, это заменить http://в URL-адресе запроса на, https://поскольку я использовал порты по умолчанию 80и 443соответственно.

iSWORD
источник
Это была проблема, с которой я столкнулся, и этот ответ оказался решением. Спасибо
Олуватоби Самуэль Омисакин
3

Обычно используется ошибка HTTP-глагола, например:

PUTМаршрут звонка с POSTзапросом

Слиман МЕХАРЗИ
источник
2

Моя проблема заключалась не в том, что мои маршруты были настроены неправильно, а в том, что я ссылался на неправильный Formметод (который я скопировал из другой формы). Я делал...

{!! Form::model([ ... ]) !!}

(без указания модели). Но я должен был использовать обычный openметод ...

{!! Form::open([ ... ]) !!}

Поскольку первым параметром, modelожидаемым от реальной модели, не было ни одной из моих опций, которые я указывал. Надеюсь, это поможет кому-то, кто знает, что их маршруты верны, но что-то еще не так.

филтафрил
источник
2

У меня также была такая же ошибка, но было другое исправление, у меня XYZ.blade.phpбыло:

{!! Form::open(array('ul' => 'services.store')) !!}

что дало мне ошибку - я до сих пор не знаю почему - но когда я изменил его на

{!! Form::open(array('route' => 'services.store')) !!}

Это сработало!

Думал, стоит поделиться :)

Ахмед Альбароди
источник
0

Laravel иногда не поддерживает {!! Form::open(['url' => 'posts/store']) !!}из соображений безопасности. Вот почему произошла ошибка. Вы можете решить эту ошибку, просто заменив приведенный ниже код

{!! Form::open(array('route' => 'posts.store')) !!}




Код ошибки {!! Form::open(['url' => 'posts/store']) !!}

Правильный код{!! Form::open(array('route' => 'posts.store')) !!}

Коварный ислам
источник
0

В моем случае это произошло потому, что моя форма отправлялась по маршруту с другим промежуточным ПО. Таким образом, он заблокировал отправку информации по этому конкретному маршруту.

ГабриэльФиль
источник
0

хорошо, когда у меня была эта проблема, я столкнулся с 2 ошибками кода

{!! Form::model(['method' => 'POST','route' => ['message.store']]) !!}

я исправил это, сделав это

{!! Form::open(['method' => 'POST','route' => 'message.store']) !!}

так что просто разглагольствовать я изменил форму modelс , openа также маршрут , где ошибочно помещены в квадратные скобки.

Филлз Адебайо
источник
-1
// not done
Route::post('`/posts/{id}`', 'PostsController@store')->name('posts.store');

return redirect('`/posts'`)->with('status','Post was created !');

// done
Route::post('`/posts`', 'PostsController@store')->name('posts.store');

return redirect('`/posts'`)->with('status','Post was created !');
Абдельхаким Эззахрауи
источник
Не могли бы вы немного объяснить, что делает этот код и как он решает проблему?
newUserName02