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

17

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

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

    
задан twoface88 26.04.2012 в 17:18
источник

2 ответа

41

В мире 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

    
ответ дан Matt 26.04.2012 в 17:33
источник
0

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 (в этом случае регистрировать службы в конфигурации и использовать ее в контроллере) в этих двух сообщениях:

ответ дан Tomáš Votruba 20.08.2017 в 23:32
источник