Синтаксис выражения

Компонент ExpressionLanguage использует особенный синтаксис, который основывается на синтаксисе выражений Twig. В этом документе вы можете найти все поддерживаемые синтаксисы.

Поддерживаемые литералы

Компонент поддерживает:

  • строки - одинарные и двойные кавычки (например, 'hello')
  • числа - например, 103
  • массивы - использование JSON-подобных нотаций (например, [1, 2])
  • хеши - использование JSON-подобных нотаций (например, { foo: 'bar' })
  • булевы значения - true и false
  • пустое значение - null

Caution

Обратный слеш (\) должен быть экранирован 4 обратными слешами (\\\\) в строке, и 8 обратными слешами (\\\\\\\\) в регулярном выражении:

1
2
echo $expressionLanguage->evaluate('"\\\\"'); // prints \
$expressionLanguage->evaluate('"a\\\\b" matches "/^a\\\\\\\\b$/"'); // returns true

Управляющие символы (например, \n) в выражениях заменяются пробелом. Для того, чтобы избежать этого, экранируйте последовательность одним обратным слешем (например, \\n).

Работа с объектами

При передаче объектов в выражение, вы можете использовать разные синтаксисы для доступа к свойствам и вызова методов в объекте.

Доступ к публичным свойствам

Публичные свойства объектов могут быть доступны через синтаксис ., схожий с JavaScript:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
class Apple
{
    public $variety;
}

$apple = new Apple();
$apple->variety = 'Honeycrisp';

var_dump($expressionLanguage->evaluate(
    'fruit.variety',
    array(
        'fruit' => $apple,
    )
));

Это выведет Honeycrisp.

Вызов методов

Синтаксис . также может быть использован для вызова методов объекта, схоже с JavaScript:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
class Robot
{
    public function sayHi($times)
    {
        $greetings = array();
        for ($i = 0; $i < $times; $i++) {
            $greetings[] = 'Hi';
        }

        return implode(' ', $greetings).'!';
    }
}

$robot = new Robot();

var_dump($expressionLanguage->evaluate(
    'robot.sayHi(3)',
    array(
        'robot' => $robot,
    )
));

Это выведет Hi Hi Hi!.

Работа с функциями

Вы также можете использовать зарегистрированные функции в выражении, используя тот же синтаксис, что в PHP и JavaScript. Компонент ExpressionLanguage поставляется с одной функцией по умолчанию: constant(), которая вернёт значение PHP константы:

1
2
3
4
5
define('DB_USER', 'root');

var_dump($expressionLanguage->evaluate(
    'constant("DB_USER")'
));

Это выведет root.

Tip

Чтобы прочитать о том, как зарегистрировать ваши собственные функции для использования в выражении, см. "Extending the ExpressionLanguage".

Работа с массивами

Если вы передаёте массив в выражение, используйте синтаксис [] для доступа к ключам массива, схоже с JavaScript:

1
2
3
4
5
6
7
8
$data = array('life' => 10, 'universe' => 10, 'everything' => 22);

var_dump($expressionLanguage->evaluate(
    'data["life"] + data["universe"] + data["everything"]',
    array(
        'data' => $data,
    )
));

Это выведет 42.

Поддерживаемые операторы

Компонент поставляется со множеством операторов:

Арифметические операторы

  • + (сложение)
  • - (вычитание)
  • * (умножение)
  • / (деление)
  • % (модуль)
  • ** (pow)

К примеру:

1
2
3
4
5
6
7
8
var_dump($expressionLanguage->evaluate(
    'life + universe + everything',
    array(
        'life' => 10,
        'universe' => 10,
        'everything' => 22,
    )
));

Это выведет 42.

Побитовые операторы

  • & (и)
  • | (или)
  • ^ (исключающее или)

Сравнительные операторы

  • == (равно)
  • === (идентично)
  • != (не равно)
  • !== (не идентично)
  • < (меньше чем)
  • > (больше чем)
  • <= (меньше или равно)
  • >= (больше или равн)
  • matches (совпадение регулярных выражений)

Tip

Чтобы протестировать, что строка не совпадает с регулярным варажением, используйте логический оператор not в сочетании с оператором matches:

1
$expressionLanguage->evaluate('not ("foo" matches "/bar/")'); // returns true

Вы должны использовать скобки, так как одинарный оператор not имеет преимущество над бинарный оператором matches.

Примеры:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
$ret1 = $expressionLanguage->evaluate(
    'life == everything',
    array(
        'life' => 10,
        'universe' => 10,
        'everything' => 22,
    )
);

$ret2 = $expressionLanguage->evaluate(
    'life > everything',
    array(
        'life' => 10,
        'universe' => 10,
        'everything' => 22,
    )
);

Обе переменные будут установлены, как false.

Логические операторы

  • not или ! (не)
  • and или && (и)
  • or или || (или)

Например:

1
2
3
4
5
6
7
8
$ret = $expressionLanguage->evaluate(
    'life < universe or life < everything',
    array(
        'life' => 10,
        'universe' => 10,
        'everything' => 22,
    )
);

Эта переменная $ret будет установлена, как true.

Строковые операторы

  • ~ (соединение)

Например:

1
2
3
4
5
6
7
var_dump($expressionLanguage->evaluate(
    'firstName~" "~lastName',
    array(
        'firstName' => 'Arthur',
        'lastName' => 'Dent',
    )
));

Это выведет Arthur Dent.

Операторы массива

  • in (содержит)
  • not in (не содержит)

Например:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
class User
{
    public $group;
}

$user = new User();
$user->group = 'human_resources';

$inGroup = $expressionLanguage->evaluate(
    'user.group in ["human_resources", "marketing"]',
    array(
        'user' => $user,
    )
);

$inGroup будет оцениваться, как true.

Числовые операторы

  • .. (диапазон)

Например:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
class User
{
    public $age;
}

$user = new User();
$user->age = 34;

$expressionLanguage->evaluate(
    'user.age in 18..45',
    array(
        'user' => $user,
    )
);

Это будет оценено, как true, потому что user.age находится в диапазоне от 18 до 45.

Троичные операторы

  • foo ? 'yes' : 'no'
  • foo ?: 'no' (равно foo ? foo : 'no')
  • foo ? 'yes' (равно foo ? 'yes' : '')

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