URL amigables Symfony2

kraneok

Pues eso, que estoy buscando y buscando y no encuentro la forma de generar un variable slug con Symfony2. He visto que existe para Doctrine una extensión que lleva un módulo que mediante anotaciones te lo hace, pero no consigo echarlo a andar.

¿ Alguien que pueda arrojarme algo de luz ?

Un saludo y gracias!

Merkury

Se llama routing

En el bundle si vas a resources -> config -> routing ahi puedes setear la ruta:

Wololo_admin_logros_editar:
    pattern: /logros/editar/{logro_id}/
    defaults: { _controller: WololoAdminBundle:Logro:editar }

Lo que va entre llaves es el parámetro para el Controller

Esto la url será:

www.tudominio.com/logros/editar/1

1 respuesta
kraneok

#2 ya, pero antes habrá que convertir el título o nombre en slug, a eso me refiero

Quiero una URL dominio.xx/ver/titulo-noticia como ejemplo y no dominio.xx/ver/1 este último no sirve para nada xdd

1 respuesta
Merkury

#3 El parametro puede ser un texto, el titulo por ejemplo. Luego con expresiones regulares puedes definir si el parametro es un entero o un texto, te dejo un ejemplo

Wololo_blog_noticias_ver:
    pattern: /ver/{title}/
    defaults: { _controller: WololoAdminBundle:Logro:editar }
    requirements:
          title: \w+

el \w+ es una cadena no nula

1 respuesta
kraneok

#4 No te enteras xd. Lo que pregunto es si Symfony tiene algún helper que transforme Hola que tal a hola-que-tal para no tener que programar yo el algoritmo

3 respuestas
xMarston

#5 No tiene pinta de que tenga algún helper de ese tipo, solo el que comentas tu de Doctrine.

1 respuesta
kraneok

#6 Nada, ni con el Doctrine ese me genera los titulos slug.

TeNSHi

#5 Échale un vistazo a esto:

http://cubiq.org/the-perfect-php-clean-url-generator

smintcs

no se como lo tendrás montado, doy por hecho que estas usando doctrine y tienes una entidad Noticia

tienes una rota loquesea/noticia/{nombreNoticia}

en el controlador le pides al repositorio la noticia que tenga ese nombre

el nombre se lo tendrás que poner en algún lado digo yo

aun así igual tendrías que mirar bien como esta montado y como estas llegando a necesitar esas noticias y esas cosas, aunque hubiera un super helper que te transformara "hola que tal" por "hola-que-tal" que pasa cuando el nombre no se pueda transformar o cuando este repetido o lo que sea?

Noticia tendria una variable id y una variable enlace, lo puedes buscar por id o por enlace, y te encargas tu de generar los enlaces de manera de que queden bien.

Aun así lo de slug no se si lo tienes del todo claro, slug es el parametro/variable/lo que sea que tu pases, el slug puede ser id=1 o nombre="rebajas-en-carrefour", los dos son slug

Luego si lo que quieres es hacer una llamada en tiempo de ejecucion a una ruta con slug tu le pasas cual es el nombre del slug y su valor, o valores si hay varios, para esto si que hay unos helpers pero para generarte la ruta.

1 respuesta
kraneok

#9 Ya conseguí hacerlo, gracias de todos modos. Un saludo

1 respuesta
TeNSHi

#10 Estaría bien una breve explicación de como lo has hecho por si alguien encuentra este hilo con la misma duda.

kraneok

En cuanto tenga un momento hago un mini tutorial. xD

1
Gantorys

Normalmente en esos casos se suele poner el ID al final y el nombre de la noticia al principio:

ver/noticias/holanda-humilla-a-la-roja-123444

sin ir más lejos, la url de este post (url-amigables-symfony2-513025)

TeNSHi

Por aportar un poco mas yo suelo hacerlo como el link que he dejado, transformo el titulo lo guardo en la entidad como slug, y en el enrutamiento hago algo en plan /noticias/{slug}-{id}, algo como tiene mediavida vamos.

1 1 respuesta
kraneok

#14 Si, pero es que me parece bastante mal la forma en que Doctrine lo hace. Es decir, con lo completo que es Symfony2, que haya que crear un campo en la tabla para generar el slug..me parece cuanto menos eficiente.

De echo estoy pensando en crear un servicio en el contenedor donde metere una clase PHP que genere los slugs al vuelo, bastante mejor.

2 respuestas
TeNSHi

#15 No se, yo creo que es un poco irrelevante, ahorras un poco de espacio en la BD gastando un poco mas de tiempo de CPU, lo mas seguro es que en ambos casos sea despreciable y no se me ocurre ningun problema salvo que no quieras que cambie el slug por temas de SEO (al editar el titulo por ejemplo), osea que "para gustos, los colores" XD

1 respuesta
kraneok

#16 Pues si, supongo que cada opción será mejor para una cosa.

Merkury

#5 Kraneok los ejemplos no son lo tuyo no? Donde pone titulo puede ser el slug y si con symfony lo normal es almacenarlo. Si no la otra opción la de toda la vida, te creas en .htaccess las reglas con el mod rewrite y a correr (hacer un servicio en el container para eso, es reinventar la rueda)

1 respuesta
kraneok

#18 Si es que yo pregunto sobre generar el slug del titulo de la noticia ( por ejemplo ), no de las rutas, las rutas si se hacerlas. Estoy diciendo que si existe una función que haciendo

$slug = slugText( "Hola texto" );
echo $slug;
# hola-texto

Lo que tu me estás diciendo no hace eso.
1 respuesta
TeNSHi

#19 Si no lo has mirado entra al enlace que te deje, la función hace eso teniendo en cuenta por ejemplo caracteres "raros" como la ñ

1 respuesta
kraneok

#20 Si eso si, pero para crear un servicio y crear una clase que lo implemente. De todos modos, como ya dije antes he descubierto como se hace con Doctrine, aunque aún tengo que implementarlo.

txandy

Yo suelo usar: http://symfony.com/doc/current/cookbook/doctrine/common_extensions.html

RaymaN

#15 generar slugs al vuelo no es mejor porque si lo editas más tarde pierdes todo el posicionamiento en buscadores.

2 respuestas
kraneok

#23 Lógico xD, no había caído.

TeNSHi

#23 Eso lo comente yo arriba, el tema es que depende de lo que quieras, por ejemplo en un foro seria raro que no se pudiese editar el slug cuando editas el titulo, en mediavida por ejemplo creo que se cambia automáticamente el slug en función del titulo.

Usuarios habituales

  • TeNSHi
  • kraneok
  • RaymaN
  • txandy
  • Merkury
  • smintcs
  • xMarston