2012-02-13 6 views
5

Estoy tratando de averiguar cuál es la mejor forma de diseñar mis URL. Así que aquí es lo que he hecho hasta ahora:¿Symfony2 maneja correctamente la URL de recuperación y debería usar URL de reposo?

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 } 

Después de probar lo que he hecho, me di cuenta que la actualización y borrado no está disponible (siempre llama account_read) ... Tras Google mi problema, descubrió que los métodos PUT y DELETE no son compatibles con todos los navegadores ... y pueden descartarse en el futuro.

Luego leí que Ruby on Rails admite estos dos métodos en todos los navegadores haciendo algo de magia.

Así que me pregunto, ¿Symfony2 puede manejar PUT y ELIMINAR como Ruby? AND ¿Debo usar url relajante?

Respuesta

12

Sí, symfony2 definitivamente cumple con RESTful.

No sé para los carriles, pero Symfony2 se encarga de la detección de los métodos HTTP utilizando diferentes maneras:

  • En primer lugar obtener la REQUEST_METHOD de php
  • entonces si y sólo método == POST, se pone el método de X-HTTP-METHOD-OVERRIDE cabecera (retorno a _method parámetro de la petición)

¿por qué se hace este chek en POST se debe a que los navegadores no pueden enviar nada más que GET o POST peticiones.

Lo que es diferente de los rieles y/o symfony1 es que no hay ayuda para generar enlaces o formularios con los métodos correspondientes. Depende de usted generar una solicitud válida para su aplicación.

PD: En cuanto a su enrutamiento, debe escribir sus requisitos en _metodo en MAYÚSCULAS.

+0

¿te tener una idea de por qué Symfony ejecuta account_read en lugar de account_delete, incluso si mi método de formulario es "DELETE"? –

+9

Su navegador nunca enviará una solicitud DELETE incluso si su html contiene '

'. Puedes emular esto usando '
' – Florian

3

Si está planeando implementar servicios RESTful, puede echar un vistazo al RestBundle. Ya tienen convenciones de nombres de url bastante buenas, con las que posiblemente puedan estar de acuerdo, y muchas otras cosas que simplificarán el proceso de desarrollo.

Y sí, Symfony2 puede manejar las solicitudes PUT y DELETE.

1

El punto no es lo que Symfony se puede hacer o no puede, la cuestión es cómo "url tranquilo" manejar con los navegadores disponibles en la actualidad ...

Algunos navegadores no permitirán que use algunos métodos HTTP (como put o borrar), de modo que sí, una buena aplicación utilizará GET, POST, PUT, DELETE y el parche, pero obtendrá problemas con algunos usuarios :)

como siempre ... los navegadores ...

Cuestiones relacionadas