компилируется...
Перейти к основному содержанию
Рекомендовать во Вконтакте Рекомендовать в Фейсбуке Рекомендовать в Твиттере

Как получить конкретные или все YAML параметры из services.yaml в Symfony 4

В более старых версиях Symfony мы определяли параметры, которые не изменялись, внутри файла config.yml:

# app/config/config.yml
# ...

parameters:
    locale: en

framework:
    # ...

    default_locale:  "%locale%"

# ...

Однако в Symfony 4 многие переменные, которые можно было использовать в config.yml, переместились в файлы env, а те параметры, которые не изменяются, теперь находятся внутри файла services.yaml. Для многих новых разработчиков в четвёртой версии фреймворка обычно непонятно, как получить эти параметры в наиболее типичных местах проекта, таких как контроллеры и службы.

В этой статье я объясню вам, как легко получить эти параметры внутри контроллеров и сервисов.

1. Убедитесь, что параметр autowire включен и у вас есть какие-нибудь дополнительные параметры.

Для того чтобы использовать стандартный способ получения параметров из файла services.yaml, вам необходимо убедиться, что в вашем проекте включены параметры autowire и autoconfigure, вы можете проверить, включены ли они в файле services.yaml, где также вы можете определить параметры для ваших сервисов:

# app/config/services.yaml

# Некоторые извлекаемые параметры
parameters:
    uploads_directory: '%kernel.project_dir%/public/uploads'
    download_directory: '%kernel.project_dir%/public/downloads'

services:
    # default configuration for services in *this* file
    _defaults:
        autowire: true      # Автоматически внедряет зависимости в ваши сервисы.
        autoconfigure: true # Автоматически регистрирует ваши сервисы в качестве команд, подписчиков на события и т.д.

Зная, что эти свойства включены, и у вас есть некоторые X параметры, которые нужно получить от сервисов или контроллера, вы готовы перейти к следующему шагу.

2. Получение параметров в контроллере

Внутри контроллера вы сможете получать параметры автоматически, внедряя интерфейс ParameterBagInterface в $parameterBag- это объект который управляет параметрами контейнера сервисов. Вы можете просто добавить параметр ParameterBagInterface и использовать его в качестве аргумента в методе контроллера, именно там где вам нужно получить некоторые параметры. Как это сделать показано в следующем примере:

namespace App\Controller;

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

// 1. Подключение класса ParameterBagInterface
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;

// 2 В общем, мы делаем следующее: автоматически внедряем в качестве аргумента интерфейс ParameterBagInterface.
// внутри метода, где необходимо получить параметр из файла services.yaml.
// а затем, используя метод get, можно получить определенный параметр.
class MyController extends AbstractController
{
    public function upload(Request $request, ParameterBagInterface $parameterBag): Response
    {
        // $uploadsDirectory содержит:
        //  /var/www/vhosts/app/public/uploads
        $uploadsDirectory = $parameterBag->get('uploads_directory');

        // ... или получить их все с помощью $parameterBag->all()
    }

    public function download(Request $request, ParameterBagInterface $parameterBag): Response
    {
        // $uploadsDirectory содержит:
        //  /var/www/vhosts/app/public/downloads
        $downloadsDirectory = $parameterBag->get('downloads_directory');

        // ... или получить их все с помощью $parameterBag->all()
    }
}

3. Получение параметров в сервисе

Если вместо контроллера вам нужно получить параметры внутри собственного сервиса, то вы также можете использовать указанную логику, но вместо того, чтобы инжектировать ParameterBagInterface в каждый метод, где это необходимо, вам нужно сохранить его в переменную внутри класса:

namespace App\Controller;

use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;

class MyService
{
    private $parameterBag;

    public function __construct(ParameterBagInterface $parameterBag)
    {
        $this->parameterBag = $parameterBag;
    }

    public function someMethod()
    {
        // $uploadsDirectory содержит:
        //  /var/www/vhosts/app/public/uploads
        $uploadsDirectory = $this->parameterBag->get('uploads_directory');

        // ... или получить их все с помощью $this->parameterBag->all()
    }
}

4. Получение параметров в Twig

Теперь давайте разберём, как же выводить значения параметров в twig шаблонах; есть несколько вариантов как это сделать. Первый вариант - установить ваши параметры в качестве глобальных переменных в Twig, как показано ниже:

# config/packages/twig.yaml
twig:
    # ...
    globals:
        ga_tracking: 'UA-xxxxx-x'

Затем вы можете получить значения в Twig (Этот параметр теперь доступен абсолютно в любом шаблоне twig):

<p>Код отслеживания google аналитики: {{ ga_tracking }}</p>

Но при таком подходе есть небольшая проблема: нам нужно добавлять параметры в 2-х местах, в файл services.yaml, а также в twig.yaml. К счастью, есть более простой способ отображения параметров в шаблонах twig с возможностью их размещения в одном месте.

5. Создание Twig расширения

Для того чтобы получить параметры из шаблонов Twig, нам нужно создать PHP функцию, которая будет получать параметры из $parameterBag и передавать их в шаблон. Вы можете создать файл ParameterExtensions.php внутри каталога app/src/Twig со следующим содержимым:

// app/src/Twig/ParameterExtensions.php

namespace App\Twig;

use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;

class ParameterExtension extends \Twig_Extension
{
    protected $parameterBag; 

    public function getFunctions()
    {
        return [
            new \Twig_SimpleFunction('get_parameter', [$this, 'getParameter'])
        ];
    }
    
    public function __construct(ParameterBagInterface $parameterBag)
    {
        $this->parameterBag = $parameterBag;
    }     

    public function getParameter($parameter)
    {
        return $this->parameterBag->get($parameter);
    }
    
    public function getName()
    {
        return 'parameter_extension';
    }
}

Это расширение добавляет в Twig новую функцию, а именно get_parameter. Эта функция получает в качестве первого аргумента имя параметра в виде строки и возвращает его, вот и все!

6. Получение параметра в Twig

Теперь в ваших шаблонах Twig вы сможете получить параметры из файла services.yaml. Например, следующие параметры:

# app/config/services.yaml
parameters:
    media_directory: '%kernel.project_dir%/public/uploads/media'
    tmp_directory: '%kernel.project_dir%/tmp'

Вы можете получить их в шаблоне вот так:

{# Выводит: /var/www/example.com/public/uploads/media #}
{{ get_parameter('media_directory') }}

{# Выводит: /var/www/example.com/tmp #}
{{ get_parameter('tmp_directory') }}

Комментарии

Пока что нет комментариев, вы можете быть первым.
Войти или Регистрация , чтобы оставлять комментарии.

Лучшие публикации

Популярные теги

Наш сайт использует куки. Узнайте больше о нашем использовании куки: политика в отношении файлов cookie
Наш сайт существует только благодаря показу онлайн-рекламы нашим посетителям.
Пожалуйста, поддержите нас, отключив блокировку рекламы.