• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Użycie POST w Route::GET

VPS Starter Arubacloud
0 głosów
284 wizyt
pytanie zadane 5 stycznia 2019 w PHP przez Greeenone Pasjonat (16,100 p.)

Hej,

Mam pewien problem z Laravelem i metodami POST oraz GET.

Posiadam stronę która wyświetla dane produktu produkty/{id}. Pod owym produktem jest formularz do aktualizacji lecz wyrzuca on błąd po próbie updatu.

Czytałem, że nie można używać POST na Route::GET. Czy ktoś wie jak temu zaradzić?

Tak wygląda mój route:

Route::group(['middleware' => ['web']], function(){
  Route::resource('products','ProductsController');
});

Mój kontroler

    public function show($id){
      $product = Products::findOrFail($id);
      return view('products.show')->with('product', $product);
    }

    public function update($id, CreateProductsRequest $request){
      $product = Products::findOrFail($id);
      $product->update($request->all());
      return redirect('home');
    }

Oraz nagłówek formularza

 {!! Form::model([$product, 'method'=>'PATCH', 'action'=>['ProductsController@update', $product->id]]) !!}

I bład który mi wyrzuca

Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException
No message

 

1 odpowiedź

0 głosów
odpowiedź 5 stycznia 2019 przez Arkadiusz Waluk Ekspert (287,550 p.)
wybrane 5 stycznia 2019 przez Greeenone
 
Najlepsza

Czytałem, że nie można używać POST na Route::GET. Czy ktoś wie jak temu zaradzić?

Na co tu chcesz radzić, przecież to całkowicie prawidłowe działanie - jeśli wysyłasz request metodą POST to jest POST, jeśli GET to jest GET, nie można sobie wysłać POST a obsłużyć jako GET.

Możesz za to dodać dwa wpisy routingu z Route::get() i Route::post() wskazujące na ten sam kontroler/tę samą metodę lub użyć Route::match(['GET', 'POST']) i wtedy będą działały obydwie metody dla danego adresu. Obecnie używasz Route::resource(), który sam dobiera metody i adresy pod domyślnego CRUDa, tutaj nic nie dostosujesz, zadziała na takie metody jak opisane jest w dokumentacji. Jeśli chcesz to dostosować musisz porobić ręczne wpisy, np. właśnie z Route::get()/post().

Skąd ten błąd nie wiem, sprawdź czy faktycznie formularz wysyła się pod właściwy adres i właściwą metodą (zgodnie z tym jaki adres działa dla jakiej metody wg dokumentacji).

1
komentarz 5 stycznia 2019 przez Tomek Sochacki Ekspert (227,510 p.)

a tak na marginesie to:

Pod owym produktem jest formularz do aktualizacji

do aktualizacji to raczej poleciłbym metodę PUT jeśli wysyłamy cały obiekt, kompletne dane, albo PATCH do updatu częściowego.

komentarz 5 stycznia 2019 przez Greeenone Pasjonat (16,100 p.)
Dzięki za odpowiedź!

Próbowałem tak jak pisałeś i nie mogło :/
komentarz 5 stycznia 2019 przez Arkadiusz Waluk Ekspert (287,550 p.)
Czyli jak próbowałeś? Wspomniałem o wielu różnych rzeczach. Co zrobiłeś, jak testowałeś, jaki efekt?
komentarz 5 stycznia 2019 przez Greeenone Pasjonat (16,100 p.)

Zadziałało stworzenie dwóch route (Post i drugi GET). Pojawił się za to inny problemy.

    public function update($id, CreateProductsRequest $request){
      $product = Products::findOrFail($id);
      $product->update($request->all());
      return redirect('/home');
    }

ReflectionException

Class App\Http\Controllers\CreateEstatesRequest does not exist

Mam drugi projekt Laravel gdzieś jest dokładnie tak samo (Tylko, że edycja jest na innej stronie) i wszystko działa a tutaj wyrzuca mi taki błąd 

komentarz 5 stycznia 2019 przez Arkadiusz Waluk Ekspert (287,550 p.)
Masz jasny i prosty błąd, nic tu więcej nie stworzę :) App\Http\Controllers\CreateEstatesRequest - nie masz takiej klasy. Może nazywa się inaczej? Albo może po prostu jest w App\Http\Requests, nie dodałeś use w tym kontrolerze i dlatego szuka w tej samej przestrzeni nazw co kontroler (App\Http\Controllers)?
komentarz 5 stycznia 2019 przez Greeenone Pasjonat (16,100 p.)
No niby tak. Robiłem krok w krok jak w kursie i tam owy plik także nie istnieje a mimo to wszystko działa. Już sam nie wiem o co chodzi. Jak formularz edycji daję do osobnego pliku, to działa bez problemu ;f
komentarz 5 stycznia 2019 przez Arkadiusz Waluk Ekspert (287,550 p.)
Musisz wiedzieć co robisz, a nie robić "krok w krok jak w kursie", bo to akurat dość błahy błąd wynikający z braku danej klasy. Tworzyłeś klasę o nazwie "CreateEstatesRequest"? Jeśli tak czy dokładnie tak się nazywa? W jakim katalogu została utworzona? Jakiego ma namespace? Czy w kontrolerze, gdzie próbujesz jej użyć, masz import (use) wskazujący na dokładnie taką samą nazwę i przestrzeń nazw jak w danej klasie?
komentarz 5 stycznia 2019 przez Greeenone Pasjonat (16,100 p.)
Wszystko działa bez problemu ! Serdecznie dziękuje za pomoc ^^

Jeszcze jedne drobne pytanie.

Czy to nie robi dużej różnicy, że zamiast Route::resource wszystkie route porobiłem oddzielnie ? Czy mogę np. użyć Route::resource a następnie jeden route stworzyć oddzielnie ?
komentarz 5 stycznia 2019 przez Arkadiusz Waluk Ekspert (287,550 p.)
Jak zrobisz oddzielnie to nie robi różnicy, żaden problem. Jak oprócz resource jeden dorobisz to też będzie działać, ale wg mnie to bez sensu. Wtedy część tych gotowych będzie nieużywana, a jak ktoś przypadkiem wywoła to sypnie błędami czy jak to widzisz? Do tego dany adres będzie już automatycznie zajęty, będziesz musiał dać jakąś inną ścieżkę. Bez sensu w mojej ocenie.

Podobne pytania

0 głosów
1 odpowiedź 174 wizyt
pytanie zadane 14 września 2019 w JavaScript przez Louel Nowicjusz (140 p.)
0 głosów
1 odpowiedź 443 wizyt
pytanie zadane 20 marca 2017 w PHP przez Gun3R Nowicjusz (120 p.)
0 głosów
1 odpowiedź 576 wizyt
pytanie zadane 14 grudnia 2017 w PHP przez mi-20 Stary wyjadacz (13,190 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...