Pregunta

Tengo un objeto Page cuya singularidad proviene de su PageDomain. El esquema está configurado de tal manera que la tabla contiene un campo page page_domain_id para crear la relación. Para mostrar una página, tengo una acción executeShow y un controlador personalizado. Mi ruta es el siguiente:

page_show:
  url:     /:domain_slug/:slug
  class:   sfPropelRoute
  options:
    model: Page
    type:  object
    method_for_criteria: doSelectByDomain
param:   { module: page, action: show }
requirements:
  sf_method: [get]

A modo de ejemplo, puede ser que tenga /audience/create y también /behavior/create. Tengo que ser capaz de determinar qué página se está solicitando.

La intención del controlador personalizado (doSelectByDomain) es un factor en la domain_slug y sólo recuperar / mostrar una página si su dominio también es correcto. Lo que estoy encontrando, sin embargo, es que a pesar de un parámetro domain_slug está disponible en el parámetro $request de la acción, no tengo manera de hacer las cosas a mi controlador personalizado para que pueda tenerse en cuenta en lo que está recuperado.

Me doy cuenta de que puedo tener acceso al objeto sfContext directamente de mi modelo, pero eso es poco elegante en el mejor y rompe MVC. Yo no tengo miedo de utilizarlo si realmente no hay mejor manera, pero parece que tiene que haber. Symfony ofrece un método setListCriteria para las rutas de la lista, pero no puedo encontrar nada similar para rutas de objetos.

Ayuda? Gracias.

¿Fue útil?

Solución

Así que un poco de riesgo a través del código fuente me llevó a donde tenía que estar. Parece que sfPropelRoute ofrece la opción method_for_criteria, pero respeta la opción de method sfObjectRoute y lo utiliza en su lugar si es que existe. Si sólo existe method_for_criteria, entonces la clase sfPropelRoute crea un objeto de criterios a partir de los parámetros de la petición.

Salvo que no incluye ningún parámetro que no son propiedades del objeto. Entiendo que hay un argumento que se hizo para que el comportamiento, pero en mi opinión es un error.

De todos modos, la versión corta es que si se utiliza la opción method, se pasan todos los parámetros (sin editar) como una matriz al controlador especificado. Si necesita parámetros de la petición distintos de los que son propiedades del objeto, esto parece ser el camino a seguir.

Otros consejos

No estoy seguro de entender el problema completamente (leí esto para la etiqueta de Propel, no la etiqueta de Symfony), sino que es el enrutamiento avanzado capítulo del Calendario de Adviento de alguna ayuda? El código se da para enseñar, pero supongo que también puede adaptarlo para Propel.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top