Метание метания лавровой меткиNotAllowedHttpException

44

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

Любая помощь будет принята с благодарностью.

  • 0
    В каком url вы получаете ошибку?
  • 0
    Вы пробовали php artisan dump-autoload ?
Показать ещё 2 комментария
Теги:
routing
laravel-4

10 ответов

113

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

Я бы разделил вашу маршрутизацию для "проверки" на отдельные маршруты 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;
}
10

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

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

Сразу после формы:: model line

  • 1
    в Laravel вы можете использовать {{ method_field('PATCH') }} в своем шаблоне.
10

Мое подозрение заключается в том, что проблема заключается в определении маршрута. Вы определили маршрут как запрос "получить", но форма, вероятно, отправляет запрос "post". Измените определение маршрута.

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

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

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

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

<?php echo Form::open(array('route' => 'validate')); ?>
9

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

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

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

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

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

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

5

<?php echo Form::open(array('action' => 'MemberController@validateCredentials')); ?>

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

вы попадаете на свои маршруты. измените его на POST в соответствующем маршруте.

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

например.

Form::open(array('url' => 'foo/bar', 'method' => 'get'))

3

Я столкнулся с ошибкой,
проблема была ФОРМОВЫЙ МЕТОД

 {{ 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)) }}
2

Как правило, в используемом HTTP-глаголе есть ошибка, например: Вызов маршрута PUT с запросом POST

2

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

"{!! Form:: open (array ('url' = > 'services.store'))!!}", который дал мне ошибку, - я все еще не понимаю почему, но когда я изменил это "{!! Форма:: open (массив ('route' = > 'services.store'))!!}" Это сработало!

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

2

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

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

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

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

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

0

Хорошо, когда я столкнулся с этой проблемой, я столкнулся с 2-мя ошибками кода {!! Form::model(['method' => 'POST','route' => ['message.store']]) !!} я исправил это, сделав это {!! Form::open(['method' => 'POST','route' => 'message.store']) !!}

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню