es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Sobreescribir los métodos del controlador de Symfony no funciona correctamente.

Estoy tratando de crear una nueva función de controlador en la clase de controlador sobrescrita, pero no funciona como se pretende.

Tengo un paquete común donde lo utilizo para muchos clientes. A veces, cuando un cliente necesita una función específica, creo una sobrescritura para el controlador común en el paquete del cliente.

Aquí está mi código para el controlador del paquete común.

class FrontController extends Controller
{
   // Este es el controlador en mi paquete común

   /**
    * @Route("/foo/{id}", name="front_view")
    */
   public function viewAction(
       string $id,
       Request $request
   ){
       // Mi código de controlador
   }
}

Aquí está el código del controlador sobrescrito para el paquete del cliente.

class ClientFrontController extends FrontController
{
   // Tengo 2 métodos de controlador en esta clase

  // El primer método sobrescribe el método viewAction del FrontController
  // Esto funciona bien
  /**
    * @Route("/foo/{id}", name="front_view")
    */
   public function viewAction(
       string $id,
       Request $request
   ){
       // Mi código de controlador
   }

  // Segundo método
  // Este es el problema
  /**
    * @Route("/foo/bar", name="foo_bar")
    */
   public function fooBarAction(
       Request $request
   ){
       // Mi código de controlador
   }
}

El problema al que me enfrento es que cuando navego a la ruta “/foo/bar”, va a “/foo/{id}” al método sobrescrito en “ClientFrontController”.

¿Por qué está sucediendo esto? ¿Cómo puedo hacer que ambas rutas funcionen correctamente?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema aquí es que ambas rutas tienen el mismo nombre, front_view, lo cual está causando conflictos cuando el sistema de enrutamiento intenta coincidir la URL con el método del controlador correcto. Para resolver esto, debes darle a cada ruta un nombre único.

    En el ClientFrontController, cambia el nombre de la segunda ruta a algo como client_foo_bar:

    /**
     * @Route("/foo/bar", name="client_foo_bar")
     */
    public function fooBarAction(Request $request)
    {
        // Mi código del controlador
    }
    

    De esta manera, el sistema de enrutamiento puede diferenciar entre las dos rutas y coincidir correctamente la URL con el método previsto.

Comments are closed.