parametr GET z adresu a POST z Ajaxa w kontrolerze

0

Witam,

Prośba o wskazówki, co jest nie tak w poniższym (uproszczonym) kodzie:

Mam taki routing:

Route::any('/photos/tag/{tag?}', 'PhotoController@tag');

I kontroller:

class PhotoController extends Controller

{

                public function tag(Request $request, $tag=null)

                {

                               if($request->isMethod("GET"))

                               {

                                               if($tag===null || !isset($tag))

                                               {

                                                               //zrób coś - DZIAŁA

                                               }

                                               else

                                               {

                                                               //zrób coś - DZIAŁA

                                               }

                                               return view('jakis_tam_widok');//wyświetla stronę w zależności od wartości parametru $tag

                               }

                               if($request->ajax())

                               {

                                               if($tag===null || !isset($tag))

                                               {

                                                               //zrób coś - DZIAŁA

                                               }

                                               else

                                               {

                                                               //zrób coś - NIE DZIAŁA

                                               }

                                               return response()->json(['jakas_dana' => $jakas_wartosc]) //zwraca dane do skryptu js

                               }

                }

}

Problem polega na tym, że w przypadku requesta ajaksowego (metodą POST) parametr $tag wynosi zawsze null bez

względu na to, co znajdzie się w adresie w miejscu zmiennej {tag}. Cała funkcjonalność natomiast działa, gdy w

miejsce parametru $tag metody tag ręcznie wpiszę jakąś wartość. Metoda GET również działa w założony sposób.

0

A nie masz przypadkiem sytanx error Route::(? Poza tym ten if jest bardzo podejrzany. Nie powinieneś robić if get. Jeżeli masz metodę w controllerze to dana metoda powinna być odpowiedzialna za dany typ requestu.

Jeżeli chcesz wyświetlić - request typu GET - tag, o jakimś ID, to masz metodę show i Route::get('/photos/tag/{tag}', 'PhotoController@show').

Jeżeli chcesz dodać tag, czy coś tam innego, to wtedy wykonujesz request typu POST do kolekcji tagów, czyli `Route::post('/photos/tag', 'PhotoController@store').

Jeżeli chcesz zmodyfikowac tag to wykonujesz request typu PUT Route::put('/photos/tag/{tag}', 'PhotoController@update').

Sugeruję zobaczyć jaką konwencję proponuje laravel czytając dokumentację, a w szczególności na temat resource routes.

Doprowadź swój kod do porządku wtedy łatwiej będzie znaleźć błąd o ile sam nie zniknie podczas tego procesu. Jeżeli chcesz wklej swój controller i widok na jakiegoś pastebina to pomogę Ci to przerobić.

0

Nie, to mój błąd przy pisaniu tego przykładu za pomocą komórki. Powinno być Route::any(). Już poprawiam.

Poza tym jeśli kontroler rozbiję na kilka method w zależności od rodzaju requesta, to w tym przypadku (chyba) stracę dostęp do wartości $_GET['tag'] gdy żądanie będzie typu POST. A to jest sedno tego kontrolera.

0
$tag===null || !isset($tag)

to jest to samo
Zrób var_dump() na $_GET i $_POST i zobacz czy Ci przychodzą te dane bo może ich nie wysyłasz tym ajax'em albo framework nie może przetworzyć.

0

Wieczorem zajmę się tym. Mnie tylko zastanawia, dlaczego wpisana na sztywno jako parametr metody index() wartość jest widziana w if($request->ajax()), a jej wartość pobrana z adresu już nie.

1

Jak to mówią... "Jak coś jest do wszystkiego, to jest do niczego".

Pisane na szybko i działa sprawdzanie wszystkich parametrów:

//Route
Route::post('test/{id?}', 'UserController@ajax')->name('ajax');
//UserController
public function ajax(Request $request, $user = null)
    {   
        if($request->ajax())
        {
            if($user == null){
                return 'user jest null '.$request->variable;
            }else{
                return 'user nie jest null  '.$request->variable;
            }
        }
    }
//script
$("button").click(function() {
    $.ajax({
        method: "POST",
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        },
        url: "{{route('ajax',[$user])}}",
        data: {
            variable: "{{$user->name}}"
        }
    })
    .done(function(msg) {
        alert(msg);
    });
});

edit: w sumie to działa to też przy Route:any dla obu IFów. Jednak nie lubię robić drabinki ifów w metodzie i wolę rozbić to od razu przy routingu (od tego w końcu mamy różne metody na Routsach :P).

if($request->isMethod("GET")){
            return $id;
        }
0

Dzięki wszystkim za podpowiedzi. Ostatecznie okazało się, że kod PHP był dobry (choć może rzeczywiście nieco zbyt rozwlekły). Problem tkwił w pliku JS, gdzie w funkcji $.ajax() miałem url odsyłający do strony głównej, zamiast do strony z określonym przeze mnie GET-em. Czyli url zawsze wyglądał tak: '/photos/', zamiast np. tak: '/photos/tag/landscape', tym samym GET zawsze był null.

1 użytkowników online, w tym zalogowanych: 0, gości: 1