2012-02-13 13 views
5

Próbuję określić, jaki jest najlepszy sposób zaprojektowania adresów URL. Więc tutaj jest to, co zrobiłem do tej pory:Czy Symfony2 poprawnie obsługuje spokojny adres URL i czy powinienem używać spokojnego adresu URL?

account_index: 
    pattern: /Accounts/ 
    defaults: { _controller: "CoreBundle:Account:index" } 
    requirements: { _method: get } 

account_create: 
    pattern: /Accounts/ 
    defaults: { _controller: "CoreBundle:Account:create" } 
    requirements: { _method: post } 

account_read: 
    pattern: /Accounts/{id} 
    defaults: { _controller: "CoreBundle:Account:show" } 
    requirements: { _method: get } 

account_update: 
    pattern: /Accounts/{id} 
    defaults: { _controller: "CoreBundle:Account:update" } 
    requirements: { _method: put } 

account_delete: 
    pattern: /Accounts/{id} 
    defaults: { _controller: "CoreBundle:Account:delete" } 
    requirements: { _method: delete } 

Po przetestowaniu co zrobiłem, zdałem sobie sprawę, że aktualizacja i usuwanie nie działa (zawsze wywołuje account_read) ... Po googlowania mój problem, ja odkryłem, że metody PUT i DELETE nie są obsługiwane we wszystkich przeglądarkach ... i mogą zostać usunięte w przyszłości.

Potem czytałem, że Ruby na szynach obsługuje te dwie metody we wszystkich przeglądarkach, wykonując trochę magii.

Zastanawiam się, czy Symfony2 może obsługiwać PUT i DELETE tak jak robi to ruby? I Czy w ogóle powinienem używać URL-a?

Odpowiedz

12

Tak, symfony2 definitywnie jest zgodna z RESTful.

nie wiem na szynach, ale Symfony2 obsługuje wykrywanie metod HTTP stosując różne sposoby:

  • najpierw uzyskać REQUEST_METHOD od php
  • i tylko wtedy, jeśli == metoda POST, dostaje od metody X-HTTP-METHOD-OVERRIDE header (rezerwowy do _method żądanie parametru)

Dlaczego to sprawia, że ​​ten Chek na POST dlatego przeglądarki nie może wysłać nic innego ale GET lub POST.

Czym różni się od szyn i/lub symfony1 jest to, że nie ma pomocnika do generowania linków lub formularzy za pomocą odpowiednich metod. Od Ciebie zależy, czy wygenerujesz prawidłowe żądanie do swojej aplikacji.

PS: Jeśli chodzi o routing, powinieneś napisać swoje wymagania na _metoda w UPPERCASE.

+0

Lubisz mam pomysł, dlaczego Symfony wykonuje account_read zamiast account_delete, nawet jeśli moja metoda formularza to "DELETE"? –

+9

Twoja przeglądarka nigdy nie wyśle ​​żądania DELETE, nawet jeśli twój html zawiera '

'. Możesz to emulować używając '
' – Florian

3

Jeśli planujesz wdrożenie usług RESTful, możesz rzucić okiem na RestBundle. Mają już całkiem niezłe konwencje nazewnictwa adresów URL, z którymi możesz się zgodzić i wiele innych rzeczy, które uprościją proces programowania.

I tak, Symfony2 może obsługiwać żądania PUT i DELETE.

1

Nie chodzi o to, co można zrobić, Symfony lub nie, chodzi o to, w jaki sposób „Spokojny url” uchwyt z aktualnymi dostępnymi przeglądarkami ...

Niektóre przeglądarki przyzwyczajenie pozwalają korzystać z niektórych metod HTTP (jak put lub usunięcie), więc tak, dobra realizacja użyje GET, POST, PUT, dELETE i łaty, ale dostaniesz problemy ze niektórzy użytkownicy :)

Jak zawsze ... przeglądarek ...

Powiązane problemy