Superposición del sitio

Enrutamiento con anotaciones Symfony 4


Supongamos que vamos a hacer una página y queremos tener un apartado para un blog si el usuario va a la ruta /blog este coincide exactamente: con el controlador blogList():

/**
 * @Route("/blog", name="blog_list")
 */
public function blogList()
{   
   return $this->json([
            'name' => 'blog_list',
            'controlador' => 'blogList'
   ]);
}

Cada entrada de nuestro blog va a estar asociada a una etiqueta, por ejemplo si queremos ingresar a todas las entradas que tengan una etiqueta, por ejemplo php o javascript para lograr esto utilizamos un comodín {nombre_comodín}:

/**
 * @Route("/blog/{tag}", name="blog_tag")
 */
public function blogTag()
{   
  return $this->json([
            'name' => 'blog_tag',
            'controlador' => 'blogTag'
  ]);
}

Cuando tenemos muchas entradas, nos vemos a la necesidad de implementar un paginador en nuestro blog:

/**
 * @Route("/blog/{page}", name="blog_page", requirements={"page"="\d+"})
 */
    public function blogPage()
    {   
        return $this->json([
            'name' => 'blog_page',
            'controlador' => 'blogPage'
        ]);
    }

Si no agregamos el requirements={«page»=»\d+»} tendríamos un problema, ya que las rutas /blog/{tag} y /blog/{page} coincidiran. Con lo cual Symfony opta por mostrar el contenido de la primera ruta definida.

requirements={«page»=»\d+»} agrega el requisito que indica al comodín {page} que solo puede aceptar números definiendo esto a través de expresiones regulares.

También podemos dar un valor predeterminado definiendo el marcador de posición (placeholder) pasando el parámetro $page = 1, así en caso de querer redirigir al apartado de /blog el paginador empezará en la primera página con lo cual no habría necesidad de definir la ruta /blog y con controlador blogList() ya que /blog/{page} se encargaría del trabajo:

/**
 * @Route("/blog/{page}", name="blog_page", requirements={"page"="\d+"})
 */
public function blogPage($page = 1)
{   
    return $this->json([
            'name' => 'blog_page',
            'controlador' => 'blogPage'
    ]);
}

Ahora puedes visualizar la ruta creada con la herramienta bin/console de la siguiente manera:

php bin/console debug:router
 -------------------------- -------- -------- ------ -----------------------------------
  Name                       Method   Scheme   Host   Path                              
 -------------------------- -------- -------- ------ -----------------------------------
  _twig_error_test           ANY      ANY      ANY    /_error/{code}.{_format}
  _wdt                       ANY      ANY      ANY    /_wdt/{token}
  _profiler_home             ANY      ANY      ANY    /_profiler/
  _profiler_search           ANY      ANY      ANY    /_profiler/search
  _profiler_search_bar       ANY      ANY      ANY    /_profiler/search_bar
  _profiler_phpinfo          ANY      ANY      ANY    /_profiler/phpinfo
  _profiler_search_results   ANY      ANY      ANY    /_profiler/{token}/search/results
  _profiler_open_file        ANY      ANY      ANY    /_profiler/open
  _profiler                  ANY      ANY      ANY    /_profiler/{token}
  _profiler_router           ANY      ANY      ANY    /_profiler/{token}/router
  _profiler_exception        ANY      ANY      ANY    /_profiler/{token}/exception
  _profiler_exception_css    ANY      ANY      ANY    /_profiler/{token}/exception.css
  default                    ANY      ANY      ANY    /default
 -------------------------- -------- -------- ------ -----------------------------------

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *