@ZardoZAntony
программист, сис. админ

Как зарегистрировать дополнительные функции для ExpressionLanguage в Symfony?

Кто-то пытался зарегать дополнительные функции для языка выражений в аннотациях\аттрибутах?
Хочу валидировать поля классов через аттрибуты, соответственно надо хотя бы count для массивов иметь. Но нашел всего один вопрос по древней 2.7 симфе и тот не решен.

Официальная дока не помогла. Никакие функции не регаются.

The function "count" does not exist around position 30 for expression `this.filterType == 'users' and count(value) == 0`.


#[Assert\Expression(
        "this.userType == 'users' and count(value) == 0",
        message: 'If filterType is "users", the array "users" should not be empty or null!',
    )]
    public array $users;


<?php

namespace App\Infrastructure\ExpressionLanguage;

use App\Infrastructure\ExpressionLanguage\Provider\ArrayCountExpressionLanguageProvider;
use Psr\Cache\CacheItemPoolInterface;
use Symfony\Component\ExpressionLanguage\ExpressionLanguage as BaseExpressionLanguage;

class ExpressionLanguage extends BaseExpressionLanguage
{
    public function __construct(CacheItemPoolInterface $cache = null, array $providers = [])
    {
        array_unshift($providers, new ArrayCountExpressionLanguageProvider());

        parent::__construct($cache, $providers);
    }
}

в провайдере
<?php

namespace App\Infrastructure\ExpressionLanguage\Provider;

use Symfony\Component\ExpressionLanguage\ExpressionFunction;
use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface;

class ArrayCountExpressionLanguageProvider implements ExpressionFunctionProviderInterface
{
    public function getFunctions()
    {
        return ExpressionFunction::fromPhp('count');
    }
}
  • Вопрос задан
  • 59 просмотров
Решения вопроса 1
@ZardoZAntony Автор вопроса
программист, сис. админ
Сам разобрался.
Тут надо массив вернуть.
class ArrayCountExpressionLanguageProvider implements ExpressionFunctionProviderInterface
{
    public function getFunctions()
    {
        return [
                 ExpressionFunction::fromPhp('count'),
       ];
    }
}


А перекрывать получается так:
services:
    validator.expression_language:
        alias: App\Infrastructure\ExpressionLanguage\ExpressionLanguage
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы