¿Qué es con Controlador?

En Symfony un controlador(Controller) es una función PHP, capas de obtener información de una petición HTTP(Request) y devuelve una respuesta HTTP(Reponse). Esta respuesta puede ser una página HTML, un documento XML, un array JSON, una imagen, una re-dirección, un error 404, o casi cualquier cosa que se pueda imaginar.

El objetivo del controlador siempre va a ser el mismo, devolver una respuesta, del objeto tipo Response en Symfony. El controlador puede obtener información de la petición, cargar un recurso de la base de datos, enviar un email, u obtener información de la sesión de usuario.

¿Cómo funciona?

Los controladores deben ir en el directorio /src/AppBundle/Controller/ así cuando los creemos, los guardamos en este lugar. Ademas su nombre debe tener el sufijo Controller, por ejemplo HelloController, BlogController, etc.

Cuando creamos un proyecto en Symfony  se crea un controlador en nuesra carpeta donde estan contenidos, su nombre es DefaultController.php, vamos a examinarlo.

<?php

namespace AppBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
 use Symfony\Bundle\FrameworkBundle\Controller\Controller;
 use Symfony\Component\HttpFoundation\Request;

class DefaultController extends Controller
 {
 /**
 * @Route("/", name="homepage")
 */
 public function indexAction(Request $request)
 {
 // replace this example code with whatever you need
 return $this->render('default/index.html.twig', array(
 'base_dir' => realpath($this->container->getParameter('kernel.root_dir').'/..'),
 ));
 }
 }

Linea 1: Nos indica que el el código es un documento PHP.

Linea 2: Indica el espacio de trabajo, se utiliza en todos los controladores, esto es una funcionalidad de PHP.

Lineas 3, 4 y 5: Symfony una vez mas utiliza funcionalidades de  PHP en este caso la palabra clave use indica que se importan las clases que van a ser utilizadas, en este caso la clase Route nos permite decidir como va a ser la ruta que va a accionar el controlador, la clase base Controller la cual incluye varios métodos y contenedores de servicios, de los cuales se explicaran algunos mas adelante; y la clase Request permite gestionar datos recibidos desde la petición.

Linea 6: Acá se define la clase , se le coloca un nombre que por convención es el mismo nombre del archivo, en este caso DefaultController y decimos que extiende de la clase Controller, esto ultimo es opcional pero en la mayoría de casos se suele usar.

Lineas 7, 8 y 9: En esta anotación definimos la ruta en la cual va a ser ejecutado el controlador, en este caso ‘/’, podría ser ‘/hola’ o cualquier cosa que nos imaginemos; ademas es opcional agregarle un nombre, esto es para hacer referencia a esta ruta desde otro lugar.

Lineas de la 10 a la 16: Este es el método IndexAction el cual se ejecutara cuando sea llamada la ruta que definimos anteriormente, estos métodos son llamados con el sufijo Action, por ejemplo HelloAction. En este caso el método retorna una vista de una plantilla HTML ‘index.html.twig’ a través del método render() que muestra una plantilla y pone ese contenido en un objeto Response. Esta plantilla se encuentra  en el directorio app/Resources/views/default/.

Clase base Controller

Utilizar la clase base Controller es opcional, si extendemos de esta conseguiremos obtener acceso a un número de métodos de ayuda y a el contenedor de servicios,  con objetos útiles llamados servicios, y Symfony incluye un objeto de servicio que puede hacer plantillas Twig, otro que puede registrar los mensajes y muchos más.

Para utilizar la clase base Controller es necesario hacer su llamado,
y al declararla extendida de esta, con lel siguiente código:

namespace AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class DefaultController extends Controller
{...

A continuación se describen algunos de los metodos y servicios de la clase Controller.

Redirigir

Si queremos redirigir a una ruta de nuestro proyecto utilizamos el método redirectToRoute() y se le pasa como parámetro el nombre de la ruta:

public function indexAction()
{
    return $this->redirectToRoute('homepage');
}

Como parámetros adicionales se le pueden pasar otro valores como variable, arreglos, etc. Si queremos redirigir a una pagina externa usamos el método redirectToRoute() como se muestra a continuación:

public function indexAction()
{
    return $this->redirect('http://symfony.com/doc');
}

Rendering Templates

Si queremos renderizar una plantilla, utilizamos el método render() que la pone en un objeto Response, se muestra a continuación:

return $this->render('hello/index.html.twig', array('name' => $name));

Ademas se pueden pasar parámetros, en este caso un array que contiene una variable del nombre

Acceso a otros servicios

Symfony viene  con una gran cantidad de paquetes con objetos, con capacidad de hacer consultas en bases de datos, enviar emails y muchas cosas mas.  el)

llamado de estos servicios se hace mediante el comando get(), como se muestra a continuación:

$templating = $this->get('templating');


$router = $this->get('router');


$mailer = $this->get('mailer');

Referencias: