2012-01-12 9 views
6

Actualmente tengo la costumbre Estructura del regulador/Acción:Symfony2: forma más sencilla de obtener las direcciones URL REST

BlogController:

/blog/list 
/blog/create 
/blog/detail/my-blog-hash 

Y PostController

/post/create 
/post/detail/my-post-hash 

Lo que me gustaría es una URL para la vista de detalle de la publicación de blog:

/blog/detail/my-blog-hash/post/my-post-hash 

Sé que hay un RESTBundle, pero esto complica mucho las cosas de IMO y hay algunos problemas reales con las rutas y la validación de formularios que no pude resolver (incluso con la ayuda de los chicos de IRC). No necesito puntos de acceso para JSON, serializadores, vistas especiales, etc., solo necesito una forma de apilar controladores de alguna manera.

¿Alguien me puede ayudar con esto?

+0

Lo que estamos pidiendo no hace ninguna lógica sentido. No puede hacer que dos controladores procesen una solicitud y luego devuelvan una respuesta. Usted ** podría ** pasarlo al 'BlogController' y luego reenviarlo al' PostController' después de eso, pero sería mucho mejor usar un controlador y hacerlo responsable de lo que sea que la acción se haga. – JamesHalsall

+0

@Jaitsu No pido una forma de manejar una solicitud con múltiples controladores. No me importa cómo funciona la ruta. Lo que quiero es una estructura de URL RESTful y una forma de estructurar los controladores para que el BlogController pueda manejar las cosas de los blogs y publicar cosas que se puedan manejar desde el PostController – stoefln

+0

No entendí la pregunta original. ¿Cuál es el problema con solo definir dos rutas separadas? – JamesHalsall

Respuesta

0

Instalé RestBundle, después de jugar varias horas lo eliminé nuevamente, debido a la inflexibilidad de las rutas (al menos no descubrí cómo configurar las rutas en consecuencia).

Después de eso configuré las rutas como en los controladores comunes. Por lo que añade anotaciones de enrutamiento así:

// BlogController 
@ORM\Route("blogs/{blogHash}", name="blog_detail") 
public function detailAction(Blog $blog) 

Y:

// PostController 
@ORM\Route("blogs/{blogHash}/post/{postHash}", name="blog_post_detail") 
public function detailAction($blogHash, $postHash) 

Importante: usted tiene que incluir la PostController antes de la BlogController en su configuración de enrutamiento

+0

parece familiar ... – maiwald

+0

@maiwald: sí, lo sé, nada especial. Esperaba una solución más "elegante". Sin embargo, agregué ese par de líneas solo por cuestiones de integridad. – stoefln

8

Esto no responde a su pregunta específica, pero yo quería recomendar un diseño de URL más limpio que sea más RESTful.

Para trabajar con los blogs en general, interactúe con el recurso base /blogs.

POST /blogs para crear un blog.

GET /blogs para mostrar todos los blogs.

Para trabajar con un blog específico, a continuación, especifique qué blog.

GET /blogs/:id para obtener los detalles del blog específico.

Ahora específico con qué subcurso de blogs desea interactuar.

POST /blogs/:id/posts para crear una nueva publicación.

GET /blogs/:id/posts/:id para obtener los detalles de una publicación específica para un blog específico.

+0

Gracias, esto tiene sentido – stoefln

0

¿No puede simplemente asignar una ruta con dos parámetros a la acción de detalle?

Estamos utilizando anotaciones para nuestras rutas, así que eso es lo que sé :) Pero supongo que la esencia de esto es la misma para todos los métodos.

/** 
* @Route("/blog/{blog_hash}/post/{post_hash}", name="post_detail") 
*/ 

El 'problema' entonces es que tienes a buscar el blog de la publicación para pasar los dos argumentos para el ayudante de dirección URL al mostrar enlaces a ella y no sólo el propio puesto. Pero no creo que haya otra manera.

La acción de detalle debe verificar que la url dada sea válida. Dudo que sf2 haga eso por ti.

+1

Esto de hecho es posible. el problema es que tienes todo el código en un controlador. Quiero que PostController maneje las cosas de la publicación y BlogController para hacer las cosas del blog. – stoefln

+0

muy cierto. ¡y me encantaría saber cómo hacerlo limpiamente! – maiwald

Cuestiones relacionadas