扩展表达语言

编辑本页

警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 3.3,现已不再维护。

本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。

扩展表达语言

可以通过添加自定义函数来扩展ExpressionLanguage。例如,在Symfony框架中,安全性具有检欧宝娱乐app下载地址查用户角色的自定义函数。

请注意

如果您想了解如何在表达式中使用函数,请阅读“表达式语法".

注册功能

函数被注册在每个特定的函数上ExpressionLanguage实例。这意味着函数可以在该实例执行的任何表达式中使用。

要注册一个函数,使用注册().这个方法有3个参数:

  • 的名字-表达式中函数的名称;
  • 编译器-在使用该函数编译表达式时执行的函数;
  • 评估者—表达式求值时执行的函数。
12 3 4 5 6 7 8 9 10 11 12 13 14
使用欧宝娱乐app下载地址组件ExpressionLanguageExpressionLanguage语言ExpressionLanguage ();语言->注册(“小写”函数str返回sprintf (”(is_string (% 1 $ s) ?strotolower (%1$s): %1$s)'str);},函数参数str如果(!is_string (str)) {返回str;}返回函数str);});var_dump (语言->评估(“小写(“HELLO”)”));

这将打印你好.这两个编译器而且评估者通过一个参数变量作为第一个参数,它等于第二个参数evaluate ()编译()(例如,求值时使用“值”,编译时使用“名称”)。

使用表达式提供程序

当你使用ExpressionLanguage类时,通常希望添加自定义函数。为此,可以通过创建实现的类来创建新的表达式提供程序ExpressionFunctionProviderInterface

该接口需要一个方法:getFunctions ()的实例,返回表达式函数的数组ExpressionFunction)登记。

12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
使用欧宝娱乐app下载地址组件ExpressionLanguageExpressionFunction使用欧宝娱乐app下载地址组件ExpressionLanguageExpressionFunctionProviderInterfaceStringExpressionLanguageProvider实现了ExpressionFunctionProviderInterface公共函数getFunctions()返回数组ExpressionFunction (“小写”函数str返回sprintf (”(is_string (% 1 $ s) ?strotolower (%1$s): %1$s)'str);},函数参数str如果(!is_string (str)) {返回str;}返回函数str);}));}}

提示

方法从PHP函数创建表达式函数fromPhp ()静态方法:

1
ExpressionFunction::fromPhp (“strtoupper”);

支持命名空间函数,但它们需要第二个参数来定义表达式的名称:

1
ExpressionFunction::fromPhp (“我的\ strtoupper”“my_strtoupper”);

3.3

ExpressionFunction: fromPhp ()方法在Symfony 3.3中引入。欧宝娱乐app下载地址

您可以使用registerProvider ()或者使用构造函数的第二个参数:

1 2 3 4 5 6 7 8 9 10
使用欧宝娱乐app下载地址组件ExpressionLanguageExpressionLanguage//使用构造函数语言ExpressionLanguage (数组StringExpressionLanguageProvider (),/ /……));//使用registerProvider()语言->registerProvider (StringExpressionLanguageProvider ());

提示

建议您自己创建ExpressionLanguage在你的图书馆上课。现在你可以通过重写构造函数来添加扩展:

12 3 4 5 6 7 8 9 10 11 12 13
使用欧宝娱乐app下载地址组件ExpressionLanguageExpressionLanguage作为BaseExpressionLanguage使用欧宝娱乐app下载地址组件ExpressionLanguageParserCacheParserCacheInterfaceExpressionLanguage扩展BaseExpressionLanguage公共函数__construct(ParserCacheInterface解析器= null,数组供应商=数组()//预先设置默认提供程序,让用户轻松重写它函数供应商StringExpressionLanguageProvider ());::__construct (解析器供应商);}}
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。