The ExpressionLanguage Component

The ExpressionLanguage component provides an engine that can compile and evaluate expressions. An expression is a one-liner that returns a value (mostly, but not limited to, Booleans).

ExpressionLanguage コンポーネントは、式をコンパイルおよび評価できるエンジンを提供します。式は、値を返すワンライナーです (ほとんどがブール値ですが、これに限定されません)。

Installation

1
$ composer require symfony/expression-language

Note

ノート

If you install this component outside of a Symfony application, you must require the vendor/autoload.php file in your code to enable the class autoloading mechanism provided by Composer. Read this article for more details.

このコンポーネントを Symfony アプリケーションの外部にインストールする場合は、Composer が提供するクラス自動ロード メカニズムを有効にするために、コード内に vendor/autoload.php ファイルを必要とする必要があります。詳細については、この記事をお読みください。

How can the Expression Engine Help Me?

The purpose of the component is to allow users to use expressions inside configuration for more complex logic. For some examples, the Symfony Framework uses expressions in security, for validation rules and in route matching.

このコンポーネントの目的は、ユーザーがより複雑なロジックの構成内で式を使用できるようにすることです。いくつかの例では、Symfony フレームワークは、セキュリティ、検証ルール、およびルート マッチングで式を使用します。

Besides using the component in the framework itself, the ExpressionLanguage component is a perfect candidate for the foundation of a business rule engine. The idea is to let the webmaster of a website configure things in a dynamic way without using PHP and without introducing security problems:

フレームワーク自体でコンポーネントを使用するだけでなく、ExpressionLanguage コンポーネントは、ビジネス ルール エンジンの基盤として最適な候補です。Web サイトの Web マスターが、PHP を使用せず、セキュリティ上の問題を引き起こすことなく、動的に構成できるようにすることを目的としています。
1
2
3
4
5
6
7
8
# Get the special price if
user.getGroup() in ['good_customers', 'collaborator']

# Promote article to the homepage when
article.commentCount > 100 and article.category not in ["misc"]

# Send an alert when
product.stock 
                    

Expressions can be seen as a very restricted PHP sandbox and are immune to external injections as you must explicitly declare which variables are available in an expression.

式は非常に制限された PHP サンドボックスと見なすことができ、式で使用できる変数を明示的に宣言する必要があるため、外部インジェクションの影響を受けません。

Usage

The ExpressionLanguage component can compile and evaluate expressions. Expressions are one-liners that often return a Boolean, which can be used by the code executing the expression in an if statement. A simple example of an expression is 1 + 2. You can also use more complicated expressions, such as someArray[3].someMethod('bar').

ExpressionLanguage コンポーネントは、式をコンパイルおよび評価できます。式は、多くの場合ブール値を返すワンライナーであり、if ステートメントで式を実行するコードで使用できます。式の簡単な例は 1 + 2 です。someArray[3].someMethod('bar') など、より複雑な式を使用することもできます。

The component provides 2 ways to work with expressions:

コンポーネントは、式を操作する 2 つの方法を提供します。
  • evaluation: the expression is evaluated without being compiled to PHP;
    評価: 式は PHP にコンパイルされずに評価されます。
  • compile: the expression is compiled to PHP, so it can be cached and evaluated.
    compile: 式は PHP にコンパイルされるため、キャッシュして評価できます。

The main class of the component is ExpressionLanguage:

コンポーネントのメイン クラスは ExpressionLanguage です。
1
2
3
4
5
6
7
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;

$expressionLanguage = new ExpressionLanguage();

var_dump($expressionLanguage->evaluate('1 + 2')); // displays 3

var_dump($expressionLanguage->compile('1 + 2')); // displays (1 + 2)

Expression Syntax

See The Expression Syntax to learn the syntax of the ExpressionLanguage component.

ExpressionLanguage コンポーネントの構文については、式の構文を参照してください。

Passing in Variables

You can also pass variables into the expression, which can be of any valid PHP type (including objects):

変数を式に渡すこともできます。これは、有効な PHP 型 (オブジェクトを含む) であれば何でもかまいません。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;

$expressionLanguage = new ExpressionLanguage();

class Apple
{
    public $variety;
}

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

var_dump($expressionLanguage->evaluate(
    'fruit.variety',
    [
        'fruit' => $apple,
    ]
)); // displays "Honeycrisp"

For more information, see the The Expression Syntax entry, especially Working with Objects and Working with Arrays.

詳細については、式の構文のエントリ、特にオブジェクトの操作と配列の操作を参照してください。

Caution

注意

When using variables in expressions, avoid passing untrusted data into the array of variables. If you can't avoid that, sanitize non-alphanumeric characters in untrusted data to prevent malicious users from injecting control characters and altering the expression.

式で変数を使用する場合は、信頼できないデータを変数の配列に渡さないようにしてください。それを避けることができない場合は、信頼できないデータの英数字以外の文字をサニタイズして、悪意のあるユーザーが制御文字を挿入して式を変更するのを防ぎます。

Caching

The component provides some different caching strategies, read more about them in Caching Expressions Using Parser Caches.

このコンポーネントは、いくつかの異なるキャッシング戦略を提供します。詳細については、パーサー キャッシュを使用した式のキャッシングを参照してください。

AST Dumping and Editing

The AST (Abstract Syntax Tree) of expressions can be dumped and manipulated as explained in Dumping and Manipulating the AST of Expressions.

式の AST (Abstract Syntax Tree) をダンプして操作することができます (式の AST のダンプと操作で説明されています)。

Learn More