метод метання laravel Метод NotAllowedHttpException


110

Я намагаюся запустити щось дуже базове. Я звик до CI і зараз вивчаю Laravel 4, а їхні документи не полегшують! У будь-якому разі я намагаюся створити форму для входу і просто переконайтесь, що дані розміщені успішно, надрукувавши їх у наступній формі. Я отримую цей виняток:

Symfony \ Компонент \ HttpKernel \ Виняток \ 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')); ?>

Будь-яка допомога буде дуже вдячна.


У якій urlви отримуєте помилку?
дев

Ви пробували php artisan dump-autoload?
Андрейко

Стара публікація, але люди все ще натикаються на неї - спробуйте "композитор дамп-автозавантаження". Працювали для мене.
kirgy

@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');

Це правильно, чи може модератор зробити це правильною відповіддю, якщо користувач не збирається? Це третя відповідь внизу, і це єдина, яка є правильною.
logos_164

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відповідно.


З цією проблемою я зіткнувся, і ця відповідь виявилася вирішенням. Дякую
Олуватобі Самуїл Омісакін

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.