theme stylesheets route link form php symfony

php - stylesheets - Funciones globales de Symfony2



twig function (2)

Por ejemplo, tengo una función algorítmica, que calcula un código hash específico. La función en sí es más de 300 líneas de código. Necesito usar esas funciones muchas veces en muchos controladores diferentes en mi paquete. ¿Dónde puedo guardar mi calculate_hash() para usarlo en mi paquete? ¿Puedo acceder desde otros paquetes? ¿También puedo escribir el método de calculate_hash() global calculate_hash() que tenga acceso al administrador de entidades ?

No encontré mi respuesta here .


Braian en el comentario solicitó la respuesta de Symfony 3, así que aquí hay una Symfony 3.3 (lanzada en mayo de 2017):

1. La clase original sigue siendo la misma.

namespace Acme/AcmeBundle/Helper; use Doctrine/ORM/EntityManager; final class AlgorithmicHelper { /** * @var EntityManager */ private $entityManager; public function __construct(EntityManager $entityManager) { $this->entityManager = $entityManager; } public function calculateHash() { // Do what you need, $this->entityManager holds a reference to your entity manager } }

2. El registro del servicio es mucho más sencillo.

# app/config/services.yml services: _defaults: autowire # this enabled constructor autowiring for all registered services Acme/AcmeBundle/Helper/AlgorithmicHelper: ~

3. Utilizar inyección de constructor para obtener el servicio.

use Acme/AcmeBundle/Helper/AlgorithmicHelper; class SomeController { /** * @var AlgorithmicHelper */ private $algorithmicHelper; public function __construct(AlgorithmicHelper $algorithmicHelper) { $this->algorithmicHelper = $algorithmicHelper; } public function someAction() { // some code $hash = $this->algorithmicHelper->calculateHash(); // some code } }

Puedes leer sobre las noticias de inyección de dependencia de Symfony 3.3 (en este caso, registrar servicios en configuración y usarlos en el controlador) en estas 2 publicaciones:


En el mundo Symfony2, esto claramente pertenece a un servicio. Los servicios son, de hecho, clases normales que están vinculadas al contenedor de inyección de dependencia. Puedes inyectarles las dependencias que necesites. Por ejemplo, digamos que la clase en la que se encuentra la función calculate_hash es AlgorithmicHelper . El servicio tiene funciones "globales". Usted define su clase algo como esto:

namespace Acme/AcmeBundle/Helper; // Correct use statements here ... class AlgorithmicHelper { private $entityManager; public function __construct(EntityManager $entityManager) { $this->entityManager = $entityManager; } public function calculate_hash() { // Do what you need, $this->entityManager holds a reference to your entity manager } }

Esta clase debe ser consciente del contenedor de dependencia de Symfony. Para esto, usted define su servicio en los archivos app/config/config.yml agregando una sección de service como esta:

services: acme.helper.algorithmic: class: Acme/AcmeBundle/Helper/AlgorithmicHelper arguments: entityManager: "@doctrine.orm.entity_manager"

Justo debajo del servicio, está la identificación del servicio. Se utiliza para recuperar su servicio en los controladores, por ejemplo. Después, especifique la clase del servicio y luego, los argumentos para pasar al constructor de la clase. La notación @ significa pasar una referencia al servicio con id doctrine.orm.entity_manager .

Luego, en tu controlador, haces algo como esto para recuperar el servicio y usarlo:

$helper = $this->get(''acme.helper.algorithmic''); $helper-> calculate_hash();

Tenga en cuenta que el resultado de la llamada a $this->get(''acme.helper.algorithmic'') siempre devolverá la misma instancia del ayudante. Esto significa que, por defecto, el servicio es único. Es como tener una clase de singleton.

Para más detalles, te invito a leer el book Symfony2. Revisa esos enlaces también

  1. La symfony.com/doc/current/book/service_container.html del contenedor de servicios del libro de Symfony2.
  2. Una respuesta que di al acceder al servicio fuera de los controladores, here .

Espero eso ayude.

Saludos,
Mate