Funciones reutilizables en controladores

En nuestros proyectos con Symfony necesitamos en muchas ocasiones, crear funciones reutilizables, que son utilizadas varias veces desde distintos Actions en nuestros Controllers.

En esta ocasión, vamos a crear una clase con varios métodos, creando un Service para una utilización más sencilla en todos los Controllers que deseemos.

1º Creamos las Funciones reutilizables

En primer lugar tenemos que crear la clase donde definimos todos los métodos que vamos a ir utilizando en nuestro proyecto Symfony.

Funciones.php

<?php

namespace AppBundle\Services;

class Funciones {

    public function test($var) {

        $response = ["recibido" => $var];

        return $response;
    }

}

Si dentro de nuestro servicio necesitamos tener disponible, por ejemplo, EntityManager o Router (después tenemos que inyectarlos en la declaración del servicio):

<?php

namespace AppBundle\Services;

use Doctrine\ORM\EntityManager;
use Symfony\Bundle\FrameworkBundle\Routing\Router;

class Funciones {

    protected $em;
    protected $router;

    public function __construct(EntityManager $entityManager, Router $router) {
        $this->em = $entityManager;
        $this->router = $router;
    }

    public function test($var) {

        $response = ["recibido" => $var];

        return $response;
    }

}

2º Declaramos el servicio

services.yml

services:
    
    app.funciones_service:
        class: AppBundle\Services\Funciones
        arguments: 
            entityManager: "@doctrine.orm.entity_manager"
            router: "@router"

3º Utilización

Ahora ya solo nos falta utilizar los métodos que hemos definido en la clase configurada como servicio.

Este es un ejemplo dentro de un controlador:

<?php

namespace AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;

class DefaultController extends Controller {

    public function indexAction(Request $request) {

        /* @var $funciones \AppBundle\Services\Funciones */
        $funciones = $this->get('app.funciones_service');
            
        dump($funciones->test("valor de prueba"));

        // replace this example code with whatever you need
        return $this->render('AppBundle:Default:index.html.twig', [
                    'base_dir' => realpath($this->container->getParameter('kernel.root_dir') . '/..'),
        ]);
    }

}

Puedes ver un comentario, en la línea 12, para saber cual es el motivo por el que lo utilizo, lee el post Como utilizar netbeans “intellisense” en servicios de Symfony2.

Ya sabemos como hacerlo, ahora solo falta que incluyas todos los métodos que necesites reutilizar en tu proyecto.

Referencias

Este asunto lo he tratado en: