扩展表达语言
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 3.4,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
扩展表达语言
可以通过添加自定义函数来扩展ExpressionLanguage。例如,在Symfony框架中,安全性具有检ob娱乐下载查用户角色的自定义函数。
请注意
如果您想了解如何在表达式中使用函数,请阅读“表达式语法".
注册功能
函数被注册在每个特定的函数上ExpressionLanguage
实例。这意味着函数可以在该实例执行的任何表达式中使用。
要注册一个函数,使用注册().这个方法有3个参数:
- 的名字-表达式中函数的名称;
- 编译器-在使用该函数编译表达式时执行的函数;
- 评估者—表达式求值时执行的函数。
例子:
12 3 4 5 6 7 8 9 10 11 12 13 14 15
使用ob娱乐下载\组件\ExpressionLanguage\ExpressionLanguage;$expressionLanguage=新ExpressionLanguage ();$expressionLanguage->注册(“小写”,函数($str){返回sprintf (”(is_string (% 1 $ s) ?strotolower (%1$s): %1$s)',$str);},函数($参数,$str){如果(!is_string ($str)) {返回$str;}返回函数$str);});var_dump ($expressionLanguage->评估(“小写(“HELLO”)”));//这将打印:hello
除了自定义函数参数外,评估者传递一个参数
变量作为它的第一个参数,它等于的第二个参数evaluate ()
(例如,求值表达式时的“值”)。
使用表达式提供程序
当你使用ExpressionLanguage
类时,通常希望添加自定义函数。为此,可以通过创建实现的类来创建新的表达式提供程序ExpressionFunctionProviderInterface.
该接口需要一个方法:getFunctions ()的实例,返回表达式函数的数组ExpressionFunction)登记:
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
使用ob娱乐下载\组件\ExpressionLanguage\ExpressionFunction;使用ob娱乐下载\组件\ExpressionLanguage\ExpressionFunctionProviderInterface;类StringExpressionLanguageProvider实现了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中引入。ob娱乐下载
您可以使用registerProvider ()或者使用构造函数的第二个参数:
1 2 3 4 5 6 7 8 9 10
使用ob娱乐下载\组件\ExpressionLanguage\ExpressionLanguage;//使用构造函数$expressionLanguage=新ExpressionLanguage (零, (新StringExpressionLanguageProvider (),/ /……]);//使用registerProvider()$expressionLanguage->registerProvider (新StringExpressionLanguageProvider ());
提示
建议您自己创建ExpressionLanguage
在你的图书馆上课。现在你可以通过重写构造函数来添加扩展:
12 3 4 5 6 7 8 9 10 11 12 13
使用ob娱乐下载\组件\ExpressionLanguage\ExpressionLanguage作为BaseExpressionLanguage;使用ob娱乐下载\组件\ExpressionLanguage\ParserCache\ParserCacheInterface;类ExpressionLanguage扩展BaseExpressionLanguage{公共函数__construct(ParserCacheInterface$解析器= null,数组$供应商= []){//将默认提供程序放在前面,让用户重写它函数$供应商,新StringExpressionLanguageProvider ());父::__construct ($解析器,$供应商);}}