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: