ExpressionLanguage组件

3.3 version
维护中的版本

ExpressionLanguage组件提供了一个引擎,用于编译和计算表达式。一个表达式就是一个单行程序(one-liner),它返回一个值(多数时候是,但并不局限于,Booleans布尔值)。

安装 

你可以通过下述两种方式安装:

然后,包容vendor/autoload.php文件,以开启Composer提供的自动加载机制。否则,你的程序将无法找到这个Symfony组件的类。

表达式引擎如何帮助我 

本组件的目的是让用户在配置过程中为复杂的逻辑而使用表达式。例如,Symfony框架在Security中使用了表达式,为的是验证时的规则(validation rules)和对路由进行匹配。

除了在框架中使用之外,ExpressionLanguage组件对于business rule engine(业务规则引擎)来说是一个非常好的候选者。其想法是让站长以一种动态方式来配置东西,而毋须使用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 < 15

表达式可被看作是极其严格的PHP沙箱,对外部注入免疫,因为你必须在表达式中显式地声明“哪个变量是可用的”。

用法 

ExpressionLanguage组件可以编译和计算表达式。表达式是单行程式,常返回布尔值,代码在 if 声明中执行表达式时要用到。一个简单的表达式例子就是 1 + 2。你可以使用更复杂的表达式,比如someArray[3].someMethod('bar')

组件为表达式提供两种工作方式:

  • evaluation: 表达式毋须经过PHP编译而直接计算;
  • compile: 表达式要被编译成PHP,因此可被缓存和计算;

组件中的主力类是 ExpressionLanguage

1
2
3
4
5
6
7
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
 
$language = new ExpressionLanguage();
 
var_dump($language->evaluate('1 + 2')); // displays 3
 
var_dump($language->compile('1 + 2')); // displays (1 + 2)

表达式语法 

参考 The Expression Syntax 来学习ExpressionLanguage组件的语法。

传入变量 

你也可以传入变量到表达式中,它可以是任何有效的PHP类型(包括objects):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
 
$language = new ExpressionLanguage();
 
class Apple
{
    public $variety;
}
 
$apple = new Apple();
$apple->variety = 'Honeycrisp';
 
var_dump($language->evaluate(
    'fruit.variety',
    array(
        'fruit' => $apple,
    )
));

这将输出 "Honeycrisp"。更多信息,参考 The Expression Syntax 引导文,特别是 使用对象使用数组

缓存 

本组件提供了一些不同的缓存策略,阅读 使用Parser Caches来缓存表达式 来了解它们。

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)