• 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

0 głosów
86 wizyt
pytanie zadane 5 stycznia w PHP, Symfony, Zend przez Greeenone Dyskutant (9,430 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 przez Arkadiusz Waluk Ekspert (242,700 p.)
wybrane 5 stycznia 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 przez Tomek Sochacki Mędrzec (166,290 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 przez Greeenone Dyskutant (9,430 p.)
Dzięki za odpowiedź!

Próbowałem tak jak pisałeś i nie mogło :/
komentarz 5 stycznia przez Arkadiusz Waluk Ekspert (242,700 p.)
Czyli jak próbowałeś? Wspomniałem o wielu różnych rzeczach. Co zrobiłeś, jak testowałeś, jaki efekt?
komentarz 5 stycznia przez Greeenone Dyskutant (9,430 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 przez Arkadiusz Waluk Ekspert (242,700 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 przez Greeenone Dyskutant (9,430 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 przez Arkadiusz Waluk Ekspert (242,700 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 przez Greeenone Dyskutant (9,430 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 przez Arkadiusz Waluk Ekspert (242,700 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ź 171 wizyt
pytanie zadane 20 marca 2017 w PHP, Symfony, Zend przez Gun3R Nowicjusz (120 p.)
0 głosów
1 odpowiedź 207 wizyt
+1 głos
1 odpowiedź 97 wizyt
Porady nie od parady
Zadając pytanie postaraj się o odpowiedni tytuł, kategorię oraz tagi.Tagi

61,378 zapytań

107,319 odpowiedzi

223,523 komentarzy

33,122 pasjonatów

Przeglądających: 354
Pasjonatów: 13 Gości: 341

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...