Ce am învățat ieri: PATCH în Lumen/Laravel

Ce am învățat ieri: PATCH în Lumen/Laravel

Lucrez la o aplicație React/Lumen și mi-am reamintit o treabă importantă: atunci când vrei să înveți ceva, pui mâna și faci. Poți să citești tone de documentație, tutoriale sau cărți, dacă nu pui mâna, nu vei putea găsi micile probleme ce nu au fost detaliate în respectivele materiale.

Și nu știu cum ești tu, dar cred că e mult mai constructiv ca, în procesul de învățare, să te lovești de mici probleme ce par ciudate, doar pentru a găsi o soluție ce îți demonstrează că modelul tău mental este greșit. 

În fine, revenind.

Avem un endpoint REST și un API CRUD. Toate operațiunile sunt făcute cu verbele http corecte: post, get, patch, delete. Deci un API ca la carte, cum ar veni.

Toate operațiunile merg bine în afară de… patch. Avem în router treaba asta:

$router->patch('/expense/{id}', ['uses' => 'ExpenseController@update']);

Request-ul îl fac așa:

const patch = new FormData();
patch.append('amount', 19.99);
axios.patch(`${expenseEndpoint}/${id}`, patch)

Dar, în ExpenseController,  dacă facem asta:

public function update($id, Request $request)
{
  print_r($request->all());
}

Primesc un array gol!

După vreo două ore în care am încercat să rezolv și să înțeleg problema, am rezolvat… cu un hack. Sau mă rog, metoda mi se pare destul de hacky, pentru că, cel puțin din punctul meu de vedere, este mai mult workaround decât soluție:

const patch = new FormData();
patch.append('amount', 19.99);
patch.append('_method', 'patch');
axios.post(`${expenseEndpoint}/${id}`, patch)

Adică schimb verbul din PATCH în POST și adaug numele metodei ca parametru.

Problema, dacă ești curios, este la… PHP! Care nu știe să citească ce i se trimite altfel decât POST

Și discuția Laravel, unde am găsit soluția 

Am găsit un middleware pentru Lumen care cică rezolvă problema. Care parsează conținutul raw primit de server și formează array-ul corect. Mie mi se pare că treaba asta e și mai hacky, deci am decis că mai bine modific request-ul axios…

Mi se pare dubios că PHP încă are problema asta, mai ales că în ultimii 3-4 ani au reînceput să scoată versiuni noi periodic.

4 Comentarii

Ionuț Staicu a scris

@Robert: La următoarea iterație :)

După atâtea ore în care mi-am stors creierii de erau toți neuronii leșinați, am lăsat-o așa.

Oricum, am în fix un singur loc din toată aplicația un form în care am nevoie și de file-upload. Momentan pot trăi cu asta, dar interceptor e o idee bună, o să investighez în viitor, mulțumesc.

Adaugă un comentariurăspuns pentru

Link-urile în context sunt binevenite. Comentariile fără nume/email valid sunt șterse.
PS: Comentariul NU este editabil.

Acest sit folosește Akismet pentru a reduce spamul. Află cum sunt procesate datele comentariilor tale.

Site-ul blog.iamntz.com utilizează cookie-uri. Continuarea navigării presupune acceptarea lor. Mai multe informații.

windows apple dropbox facebook twitter