七月
07
2016

表达式语言(ExpressionLanguage)组件

表达式语言(ExpressionLanguage)提供了一个用于编译和执行表达式的引擎。通常(但不限于)一个表达式便是一个返回布尔值(Boolean)的单行程序。

安装

你可以通过两种不同的方式安装该组件:

表达式引擎可以提供哪些帮助

该组件的目的是帮助用户在复杂的逻辑当中使用表达式。例如,Symfony2 框架在 Security 中的验证规则和路由匹配中使用了表达式。

除了框架自身使用表达式组件,它还是业务规则引擎基础中的最佳备选组件。也就是说网站管理员可以通过一种无需使用 PHP 且不会导致安全问题的动态的方式完成网站配置类的事务。

# 获得特殊的价格,如果满足下面的条件
user.getGroup() in ['good_customers', 'collaborator']

# 推送文章到网站首页,当满足下面的条件
article.commentCount > 100 and article.category not in ["misc"]

# 发送一条警告,当满足下面的条件
product.stock < 15

表达式可以被看做是一个有着特殊限制的 PHP 沙盒,它将通过要求你必须明确地在表达式中声明了某个变量是可用的来避免外部的注入。

使用

表达式语言组件可以编译以及执行表达式。表达式通常是一个返回 Boolean 的单行程序,它将可以被代码中类似于if 这样的结构体代码执行。例如,一个简单的表达式可以是 1 + 2 这样的。而一个更为复杂的表达式可以是 someArray[3].someMethod('bar') 这样的。

组件提供了两种方式来执行表达式:

  • evaluation: 表达式将不会被编译为 PHP,而是直接执行
  • compile: 表达式将被编译为 PHP,因此编译过后得到的代码可以被缓存和执行

组件的入口类是 ExpressionLanguage

use Symfony\Component\ExpressionLanguage\ExpressionLanguage;

$language = new ExpressionLanguage();

var_dump($language->evaluate('1 + 2')); // 结果显示为 3

var_dump($language->compile('1 + 2')); // 结果显示为 (1 + 2)

表达式语法

表达式语言组件的语法详见章节:表达式语法(英文

传递变量

你也可以在表达式中传递变量,这些变量可以是任何 PHP 中有效的变量类型(包括对象)。

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 ExpressionLanguage Component

非特殊注明博文为 爱PHP吧(www.iphp8.com)原创内容,转载请注明原文地址:http://www.iphp8.com/?post=93

评论

发表评论:

(选填)

(选填)