¿Por qué no me funciona el redirectToRoute?

En la aplicación que estoy desarrollando uso el FOSUserBundle. Cada vez que hago una modificación en la BD quiero asegurarme que hay un usuario autenticado (es un comprobación básica, más adelante tendré que validar que el usuario tenga las autorizaciones necesarias para realizar la acción requerida. Por ahora solo quiero verificar que hay un usuario logueado). Si el usuario no está autentificado cargo un mensaje flash y lo envío a la página de Log-in. El problema es que el redirectToRoute no me funciona y no sé que estoy haciendo mal (el mensaje flash funciona bien, pero el redirect No).

El controlador no extiende directamente del Controller, extiende de un controlador que añade funciones genéricas al proyecto y que no las posee Symfony, y este último si extienden del Controller.

Controlador que agrega funciones al Controller:

/**
 * Description
 *
 * @author GonzaLo
 */
class GenericController extends Controller {
 
...
 
}

El controlador que utiliza la función redirectToRoute:

/**
 * Description of ControllerCRUD
 *
 * @author GonzaLo
 */
class CRUDController extends GenericController {
 
...
 
   /**
    * 
    * @author GonzaLo 
    */
    protected function putBackActiveEntity($entity, $englishNameClassEntity) {
 
        if (false === $this->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY')) {
 
            // Genero un mensaje de error informando de la situación.
            $this->messageFlashCustom('error', 'Ups! hay un problema con la autenticación del usuario.');
 
            return $this->redirectToRoute('fos_user_security_login');
        }
 
    }
 
...
 
}

El return $this->redirectToRoute('fos_user_security_login'); no me funciona y no sé que estoy haciendo mal.

Si me pueden ayudar se los agradecería.

Respuestas

#1

Me parece rarísimo que no te funcione el redirectToRoute() porque es un método muy simple. Prueba a hacer un dump($this->redirectToRoute('fos_user_security_login')); exit; justo antes del return. En pantalla deberías ver un objeto de tipo RedirectResponse() y la URL debería ser la correspondiente a la ruta fos_user_security_login.

Si puedes, dinos también cuál es el error exacto que se produce: dices que el redirectToRoute() no funciona ... pero no especificas si está redirigiendo a una URL incorrecta o si no redirige a nada o si se muestra otro mensaje de error.

#2

Tu clase genérica está extendiendo de la clase Controller correcta (FrameworkBundle)?

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

A veces damos Ctrl+ Space y no revisamos el namespace de la clase.

El mismo @javiereguiluz en otra respuesta ya ha aclarado este tema con las clases Request y Response.

Saludos.

#3

Hola, gracias a ambos por las sugerencias. Ya encontré el problema.

Lo comento por si aparece otro caso similar.

En mi programa generé controladores principales y controladores secundarios (por llamarlo de algún modo). Los controladores principales son los que están vinculados con el sistema de routing (se los ejecuta a travez de una ruta), estos extienden de los controladores secundarios. Por otro lados los controladores secundarios no son llamados por las rutas, simplemente extienden a los controladores principales para proveerlos de funicones genéricas y repetirás en varios controladores principales. Los controladores secundarios extienden del Controlador base se Symfonty (use Symfony\Bundle\FrameworkBundle\Controller\Controller). Trato de hacer la cascada solo en dos niveles (primarios y secundario o madre e hija), pero en pocas ocasiones tengo un cascadeo de 3 niveles (primarios, secundario y terciario).

El redirectToRoute lo estaba aplicando a un controlador secundario, por eso no me redireccionaba, al pasar la función a un controlador primario (el 1º que se ejecuta y es llamado por la ruta, hace el redirectToRoute y termina la ejecución del controlador) empezó a funcionar.

Entiendo que al estar el redirectToRoute en un controlador secundario este cortaba su ejecución luego de querer redireccionar, pero el controlador 1º (el que llamó al 2º) seguía su ejecución normal, generando errores y sin redireccionar efectivamente la página.

No sé si esta bien lo que estoy haciendo con los controladores, pero es la forma que encontré para la reuntilización de código y no generar código repetido con todos los problemas que eso ocaciona.

Gracias nuevamente.