支付宝扫一扫付款
微信扫一扫付款
(微信为保护隐私,不显示你的昵称)
ExpressionLanguage组件提供了一个引擎,用于编译和计算表达式。一个表达式就是一个单行程序(one-liner),它返回一个值(多数时候是,但并不局限于,Booleans布尔值)。
你可以通过下述两种方式安装:
通过Composer安装(Packagist上的symfony/expression-language
)
然后,包容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')
。
组件为表达式提供两种工作方式:
组件中的主力类是 ExpressionLanguage
:
参考 The Expression Syntax 来学习ExpressionLanguage组件的语法。
你也可以传入变量到表达式中,它可以是任何有效的PHP类型(包括objects):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
这将输出 "Honeycrisp"。更多信息,参考 The Expression Syntax 引导文,特别是 使用对象 和 使用数组。
本组件提供了一些不同的缓存策略,阅读 使用Parser Caches来缓存表达式 来了解它们。
本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。