Глобальные функции Symfony2

Например, у меня есть алгоритмическая функция, которая вычисляет конкретный хэш-код. Сама функция – это 300 + строк кода. Мне нужно использовать эти функции много раз во многих разных контроллерах в моем комплекте. Где я могу сохранить свой calculate_hash() чтобы использовать его в моем пакете? Могу ли я получить доступ к нему из других пакетов? Могу ли я также написать global calculate_hash() которые имеют доступ к диспетчеру сущностей ?

Я не нашел здесь своего ответа.

Solutions Collecting From Web of "Глобальные функции Symfony2"

В мире Symfony2 это явно принадлежит сервису. Услуги на самом деле являются нормальными классами, которые привязаны к контейнеру для инъекций зависимостей. Вы можете придать им нужные вам зависимости. Например, скажем, ваш класс, где находится функция calculate_hash – это AlgorithmicHelper . Служба имеет «глобальные» функции. Вы определяете свой класс следующим образом:

 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 } } 

Затем этот класс должен быть ознакомлен с контейнером symfony dependecy. Для этого вы определяете свою службу в файлах app/config/config.yml , добавляя раздел service например:

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

Только ниже службы – это идентификатор службы. Например, он используется для извлечения вашего сервиса в контроллерах. После этого вы указываете класс службы, а затем аргументы, передаваемые конструктору класса. Обозначение @ означает передачу ссылки на службу с id doctrine.orm.entity_manager .

Затем в вашем контроллере вы делаете что-то вроде этого, чтобы получить услугу и использовать ее:

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

Обратите внимание, что результат вызова метода $this->get('acme.helper.algorithmic') всегда возвращает тот же экземпляр помощника. Это означает, что по умолчанию службы уникальны. Это похоже на одиночный класс.

Для получения дополнительной информации я приглашаю вас прочитать книгу Symfony2. Проверьте эти ссылки также

  1. Раздел сервисного контейнера из книги Symfony2.
  2. Ответ, который я дал на доступ к внешнему контроллеру, здесь .

Надеюсь, поможет.

С Уважением,
Matt

Braian в комментарии попросил Symfony 3 ответить, так вот вот один Symfony 3.3 (выпущен в мае 2017 года):

1. Первоначальный класс остается тем же

 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. Регистрация услуг намного проще

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

3. Используйте инъекцию конструктора для получения услуги

 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 } } 

Вы можете прочитать информацию об инъекции зависимостей Symfony 3.3 (в этом случае регистрировать службы в конфигурации и использовать ее в контроллере) новости в этих двух сообщениях: