laravel rzucanie MethodNotAllowedHttpException

110

Próbuję uzyskać coś bardzo podstawowego do biegania. Jestem przyzwyczajony do CI, a teraz uczę się Laravel 4, a ich doktorzy nie ułatwiają tego! W każdym razie próbuję utworzyć formularz logowania i upewnić się, że dane zostały przesłane pomyślnie, drukując je w kolejnym formularzu. Otrzymuję ten wyjątek:

Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException

i mój 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');
        }
    }

a trasy mają:

Route::get('/', function()
{
    return View::make('hello');
});

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

i wreszcie mój widok login.php ma ten kierunek formularza:

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

Każda pomoc będzie bardzo mile widziana.

spacemonkey
źródło
W którym urlotrzymujesz błąd?
devo
Czy próbowałeś php artisan dump-autoload?
Andreyco
Stary post, ale ludzie wciąż się na niego natkną - spróbuj "composer dump-autoload". Pracował dla mnie.
kirgy
@Andreyco to polecenie nie jest zdefiniowane.
Marcelo Agimóvel

Odpowiedzi:

198

Otrzymujesz ten błąd, ponieważ publikujesz na GETtrasie.

Podzieliłbym twój routing validatena osobne GETi POSTtrasy.

Nowe trasy:

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

Route::get('validate', function () {
    return View::make('members/login');
});

Wtedy twoja metoda kontrolera może być po prostu

public function validateCredentials()
{
    $email = Input::post('email');
    $password = Input::post('password');
    return "Email: " . $email . " and Password: " . $password;
}
siano
źródło
25

Podejrzewam, że problem leży w twojej definicji trasy.

Zdefiniowałeś trasę jako GETżądanie, ale prawdopodobnie formularz wysyła POSTżądanie. Zmień definicję trasy.

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

Generalnie lepszą praktyką jest używanie nazwanych tras (pomaga skalować, jeśli zmieni się metoda / klasa kontrolera).

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

W formularzu użyj następujących

<?php echo Form::open(array('route' => 'validate')); ?>
Błogosławieństwo
źródło
23

Problem polega na tym, że używasz, POSTale w rzeczywistości musisz wykonać, PATCH aby naprawić ten dodatek

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

Zaraz za Form::modellinią

Eli
źródło
1
w Laravel możesz użyć {{ method_field('PATCH') }}w swoim szablonie.
Michael Yousrie
13

Dzieje się tak, ponieważ publikujesz dane za pomocą metody get.

Zamiast

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

Spróbuj tego

Route::post('/validate', 'MemberController@validateCredentials');
minitechi
źródło
Zgadza się, czy moderator może podać poprawną odpowiedź, jeśli użytkownik tego nie zrobi? To jest trzecia odpowiedź w dół i jedyna poprawna.
logos_164
12

I napotkał ten problem, jak również i inne odpowiedzi tutaj były pomocne, ale używam Route::resourcektóry opiekuje GET, POSToraz inne wnioski.

W moim przypadku zostawiłem trasę tak, jak jest:

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

I po prostu zmodyfikowałem mój formularz, aby był zgodny z storefunkcją w myFilesController

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

To rozwiązało problem i pomyślałem, że warto wskazać na osobną odpowiedź, ponieważ różne inne odpowiedzi sugerują dodanie nowej POSTtrasy. To jest opcja, ale nie jest to konieczne.

Dan
źródło
9

Zwykle MethodNotAllowedHttpExceptiondzieje się, gdy

metoda trasy nie pasuje.

Załóżmy, że definiujesz POSTplik trasy żądania, ale wysyłasz GETżądanie do trasy.

kousher alam pranto
źródło
7
<?php echo Form::open(array('action' => 'MemberController@validateCredentials')); ?>

domyślnie Form::open()zakłada POSTmetodę.

masz GETna swoich trasach. zmień go na POSTw odpowiedniej trasie.

lub jeśli chcesz użyć tej GETmetody, dodaj methodparametr.

na przykład

Form::open(array('url' => 'foo/bar', 'method' => 'get'))
itachi
źródło
4

Napotkałem błąd,
problem dotyczył FORMULARZA

{{ Form::open(array('url' => 'admin/doctor/edit/'.$doctor->doctor_id,'class'=>'form-horizontal form-bordered form-row-stripped','method' => 'PUT','files'=>true)) }}

Tak powinno być

{{ Form::open(array('url' => 'admin/doctor/edit/'.$doctor->doctor_id,'class'=>'form-horizontal form-bordered form-row-stripped','method' => 'POST','files'=>true)) }}
Faruk Omar
źródło
4

W moim przypadku wysyłałem POSTżądanie HTTPdo serwera, na którym ustawiłem Nginxprzekierowanie wszystkich żądań do portu 80na port, na 443którym obsługiwałem aplikację HTTPS.

Wysłanie żądania do właściwego portu bezpośrednio rozwiązało problem. W moim przypadku, wszystko, co musiałem zrobić, to zastąpić http://w adresie URL żądania do https://ponieważ używałem domyślne porty 80i 443odpowiednio.

iSWORD
źródło
To był problem, przed którym stanąłem i ta odpowiedź okazała się rozwiązaniem. Dziękuję
Oluwatobi Samuel Omisakin
3

Generalnie występuje błąd w używanym czasowniku HTTP, np .:

PUTTrasa dzwoniąca z POSTprośbą

Slimane MEHARZI
źródło
2

Mój problem nie polegał na tym, że moje trasy były ustawione nieprawidłowo, ale na tym, że odwoływałem się do niewłaściwej Formmetody (którą skopiowałem z innego formularza). Ja robiłem...

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

(bez określonego modelu). Ale powinienem był użyć zwykłej openmetody ...

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

Ponieważ pierwszym parametrem, który modeloczekiwał rzeczywistego modelu, nie był uzyskiwanie żadnej z moich opcji, które określałem. Mam nadzieję, że pomoże to komuś, kto wie, że ich trasy są prawidłowe, ale coś innego jest nie tak.

philthathril
źródło
2

Miałem również ten sam błąd, ale miałem inną poprawkę, w moim XYZ.blade.phpmiałem:

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

co dało mi błąd - nadal nie wiem dlaczego - ale kiedy zmieniłem to na

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

Zadziałało!

Pomyślałem, że warto się tym podzielić :)

Ahmed Albarody
źródło
0

Laravel czasami nie obsługuje {!! Form::open(['url' => 'posts/store']) !!}ze względów bezpieczeństwa. Dlatego wystąpił błąd. Możesz rozwiązać ten błąd, zastępując poniższy kod

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




Kod błędu Kod {!! Form::open(['url' => 'posts/store']) !!}

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

Wspaniały islam
źródło
0

W moim przypadku było tak, ponieważ mój formularz wysyłał na trasę z innym oprogramowaniem pośredniczącym. Więc zablokował wysyłanie informacji na tę konkretną trasę.

GabrielFiel
źródło
0

dobrze, kiedy miałem ten problem, napotkałem 2 błędy kodu

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

poprawiłem to, robiąc to

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

więc żeby się rozpracować, zmieniłem formę modelna, opena także trasę, która została źle umieszczona w nawiasach kwadratowych.

Fillz Adebayo
źródło
-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 !');
Abdelhakim Ezzahraoui
źródło
Czy mógłbyś wyjaśnić trochę, co robi ten kod i jak rozwiązuje problem?
newUserName02