Как использовать сопоставители для подключения профилировщика в зависимости от условий

Как использовать сопоставители для подключения профилировщика в зависимости от условий

Профилировщик Symfony активируется только в окружении разработки, чтобы не вредить производительности вашего приложения. Однако, иногда может быть полезным включать профилировщик в окружении производства в зависимости от условий, чтобы помочь вам в отладке проблем. Это поведение реализуется с помощью Сопоставителей запросов.

Использование встроенного сопоставителя

Сопоставитель запросов - это класс, который проверяет, соответствует ли данный экземпляр Request набору условий. Symfony предоставляет встроенный сопоставитель, который сопоставляет пути и IP. Например, если вы хотите показывать профилировщик только, когда получаете доступ к странице с IP 168.0.0.1, то вы можете использовать эту конфигурацию:

  • YAML
    1
    2
    3
    4
    5
    6
    # app/config/config.yml
    framework:
        # ...
        profiler:
            matcher:
                ip: 168.0.0.1
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    <!-- app/config/config.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:framework="http://symfony.com/schema/dic/symfony"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-Instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd
            http://symfony.com/schema/dic/symfony
            http://symfony.com/schema/dic/symfony/symfony-1.0.xsd">
    
        <framework:config>
            <!-- ... -->
            <framework:profiler>
                <framework:matcher ip="168.0.0.1" />
            </framework:profiler>
        </framework:config>
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // app/config/config.php
    $container->loadFromExtension('framework', array(
        // ...
        'profiler' => array(
            'matcher' => array(
                'ip' => '168.0.0.1',
            )
        ),
    ));
    

Вы также можете установить опцию path, чтобы определить путь, по которому должен быть включен профилировщик. Например, установка его как ^/admin/ будет включать профилировщик только для URL, начинающихся с /admin/.

Создание пользовательского сопоставителя

Используя концепт Сопоставителей запросов вы можете определять пользовательский сопоставитель так, чтобы он включал профилировщик в вашем приложении при определённых условиях. Чтобы сделать это, создайте класс, реализующий RequestMatcherInterface. Этот интерфейс требует одного метода: matches(). Этот метод возвращает false, когда запрос не совпадает с условиями, а в обратном случае - true. Следовательно, пользовательский сопоставитель должен возвращать false, чтобы отключать профилировщик, и true - чтобы подключать его.

Представьте, что профилировщик должен подключаться каждый раз, когда выполняет вход пользователь с ролью ROLE_SUPER_ADMIN. Вот весь код, который нужен для этого пользовательского сопоставителя:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
// src/AppBundle/Profiler/SuperAdminMatcher.php
namespace AppBundle\Profiler;

use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestMatcherInterface;

class SuperAdminMatcher implements RequestMatcherInterface
{
    protected $authorizationChecker;

    public function __construct(AuthorizationCheckerInterface $authorizationChecker)
    {
        $this->authorizationChecker = $authorizationChecker;
    }

    public function matches(Request $request)
    {
        return $this->authorizationChecker->isGranted('ROLE_SUPER_ADMIN');
    }
}

Далее, вам понадобится убедиться, что ваш класс определён, как сервис. Если вы используете конфигурацию services.yml по умолчанию, то вам не нужно ничего делать!

Как только сервис зарегистрирован, то единственное, что остаётся сделать - это сконфигурировать профилировщик так, чтобы он использовать сервис в качестве сопоставителя:

  • YAML
    1
    2
    3
    4
    5
    6
    # app/config/config.yml
    framework:
        # ...
        profiler:
            matcher:
                service: AppBundle\Profiler\SuperAdminMatcher
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    <!-- app/config/config.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:framework="http://symfony.com/schema/dic/symfony"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-Instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd
            http://symfony.com/schema/dic/symfony
            http://symfony.com/schema/dic/symfony/symfony-1.0.xsd">
    
        <framework:config>
            <!-- ... -->
            <framework:profiler>
                <framework:matcher service="AppBundle\Profiler\SuperAdminMatcher" />
            </framework:profiler>
        </framework:config>
    </container>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    // app/config/config.php
    use AppBundle\Profiler\SuperAdminMatcher;
    
    $container->loadFromExtension('framework', array(
        // ...
        'profiler' => array(
            'matcher' => array(
                'service' => SuperAdminMatcher::class,
            )
        ),
    ));
    

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.