symfony: routing
TRANSCRIPT
Remembering
• Routing Component • Mapea una request HTTP a unas variables definidas.
Para acabar dispatcheando un controlador que invocará un método con una respuesta.
Nuestros amigos:$ bin/console debug:router$ bin/console server:start
Remembering
• Crear un nuevo proyecto Symfony
• En el propio AppBundle, crear un nuevo Controller mediante annotations:
• Devolver una Response `Hello World`
• Devolver una Response con un Twig Template con un `Hello World`
• Hacer lo anterior, pero esta vez definiendo las rutas con yaml
BONUS: Ahora a través de cli !
Routing, ahora si
Una ruta puede llegar a definir hasta 7 especificaciones:
2. Array de valores por defecto (defaults)
1. La url de la ruta, pudiendo especificar claves dinámicas. (path)
3. Array de requerimientos (requirements)4. Array de opciones (options)5. Un host (host) 6. Array de protocolos (schemes) (HTTP, HTTPS)7. Array de métodos (methods) (GET, POST, HEAD…)
Combinación de múltiples definiciones de routing
app/config/routing.yml app: resource: "@UvinumBundle/Controller" type: annotation home: path: / defaults: { _controller: UvinumBundle:Home:index } search: path: /{search_term}_s defaults: { _controller: UvinumBundle:Search:index } backend: resource: "routing/backend.yml" prefix: /backend/ host: "admin.%base_domain%" frontend: resource: "routing/frontend.yml" prefix: /{_locale}/ host: "%base_domain%" requirements: _locale: (es|ca|en)
Definición de idioma en app/config.yml
app/config.yml parameters: locale: en languages: ['en','ca','es'] base_domain: planningstar.com
app/config.yml
translator: { fallbacks: [%locale%] }
app/Resources/views/index.html.twig
{{ 'Departments of %company%'|trans({'%company%': company.name}) }}
OR
{% trans with {'%company%': company.name}%}Employees of %company%{% endtrans %}
Traducciones en app/Resources/translations/messages.{locale}.yml
Traducciones
Generar URLs
• Desde las plantillas TwigExisten dos funciones principales: {{ path }} y {{ url }}<ul> <li> <a href="{{ url('home') }}">Home</a> </li> <li> <a href="{{ url('search', {'search_term': 'término de búsqueda'|escape}) }}">Búsqueda</a> </li> </ul>
• Mediante el Router de Symfony$router = $this->get('router'); $url = $router->generate( 'frontend_user_profile', ['username' => 'obokaman'], Router::ABSOLUTE_URL );
Os reto a…
• Limpiar las URL que terminen en /
• Definir una serie de rutas:
• Annotations (Para que veáis como se definen)
• Definición de distintas rutas en el propio yml
• Resources de otros ymls con requirements
• Habiendo definido una serie de URLs con prefijo de idioma, forzar que la raíz redirija a un idioma por defecto. Idem con los listados y su paginación.
Frontend
Se definirá la aplicación para 3 idiomas distintos (a elegir). La respuesta del listado de artículos podrá ser también en .json. Sitemap, aprox:
• /home • /articulos
• /articulos/categoria • /articulos/pagina-actual (versión en HTML y en JSON)
• /about
Pro Tip: Haced uso de los _locales y del _format ;)
Backend
Sitemap, aprox: • /backend
• /backend/{usuario}/profile • /backend/{usuario}/profile/edit
• /backend/{usuario}/article/{slug} • /backend/{usuario}/article/{slug}/add • /backend/{usuario}/article/{slug}/edit • /backend/{usuario}/article/{slug}/delete
Pro Tip: Tened en cuenta que se sirva desde un host distinto (admin.localhost por ejemplo), los verbos para cada url, fijos si podéis meter un prefix e
intentad separad en ymls distintos para temáticas distintas ;)