新在Symfo欧宝娱乐app下载地址ny 2.4: ExpressionLanguage组件
警告:这篇文章是关于一个不受支持的Symfony的版本。欧宝娱乐app下载地址其中一些信息可能是过时了。阅读最近的Symfony文档欧宝娱乐app下载地址。
欧宝娱乐app下载地址Symfony 2.4提供了一个新的组件:ExpressionLanguage。ExpressionLanguage提供了一个引擎,可以编译和评估表达式。
语言只是一个模型版本的树枝表达式。所以,一个表达式是一个一行程序,返回一个值(通常,但不限于,布尔值)。
不像树枝,ExpressionLanguage工作在两种模式:
- 编译:表达式编译为后评价(注意,PHP编译PHP代码不依赖于运行时环境);
- 评价:在计算表达式没有第一次编译PHP。
能够编译表达式一个简单的PHP字符串不需要运行时环境,。
操作符调用必须明确,以避免任何含糊不清:foo.bar
对象属性,foo['酒吧')
对于数组调用foo.getBar ()
方法调用。
使用组件是简单的,因为它可以得到:
1 2 3 4 5 6 7 8 9
使用欧宝娱乐app下载地址\组件\ExpressionLanguage\ExpressionLanguage;美元语言=新ExpressionLanguage ();回声美元语言- >评估(“1 + 1”);/ /将回声2回声美元语言- >编译(“1 + 2”);/ /将回声”(1 + 2)”
表达式语言支持一切树枝支持:数学运算符、字符串、数字、数组、哈希表、布尔值、……
表达式可以被视为一个非常限制PHP沙箱和不受外部注入您必须显式地声明的变量在一个表达式编译或评估时:
1 2 3
美元语言- >评估(“a.b”,数组(“一个”= >新stdClass ()));美元语言- >编译(“a.b”,数组(“一个”));
最后,您可以轻松地扩展语言通过函数;他们工作在树枝同行一样注册()
方法以获取更多信息。)
一些用例呢?好了,我们可以利用新组件在不同其他内置Symfony组件。欧宝娱乐app下载地址
服务容器
你可以在任何地方使用一个表达式可以传递一个参数在服务容器:
1
美元c- >注册(“foo”,“Foo”)- >addArgument (新表达式(“bar.getvalue ()”));
的容器,一个表达式访问两个函数:服务()
服务,参数
得到参数值:
1
服务(“酒吧”).getValue(参数(“价值”))
或在XML:
1 2 3
<服务id=“foo”类=“Foo”><论点类型=“表情”>服务(酒吧).getvalue(参数(“价值”))< /论点>< /服务>
没有在运行时开销PHP翻车机使用表达式编译器;前面的表达式编译PHP代码如下:
1
美元这- >get (“酒吧”)- >getvalue (美元这- >getParameter (“价值”))
访问控制规则
配置一些安全访问控制规则可以混乱,这可能会导致不安全的应用程序。
新allow_if
设置简化的方式配置访问控制规则:
1 2
access_control:- - - - - -{路径:^ / _internal /安全,allow_if:“127.0.0.1 = = request.getClientIp()或has_role (ROLE_ADMIN)”}
这条规则限制了url开始/ _internal /安全
人们从localhost浏览;请求
,令牌
和用户
你可以访问的变量,is_anonymous ()
,is_authenticated ()
,is_fully_authenticated ()
,is_rememberme ()
,has_role ()
在这个上下文中定义的函数。
您还可以使用表达式在树枝使用新模板表达式
功能:
1 2 3
{%如果is_granted(表达式(“has_role (" FOO "))) %}…{%endif%}
如果你使用SensioFrameworkExtraBundle,你也得到一个新的注释,@Security
安全控制器:
1 2 3 4 5 6 7
/ * * *@Route(“/ post / {id}”) *@Security(“has_role (ROLE_ADMIN)”) * /公共函数showAction(文章美元帖子){}
请注意
的@Security
注释将版本3包的一部分,在Symfony 2.4之前公布决赛。欧宝娱乐app下载地址
缓存
版本3 SensioFrameworkExtraBundle还附带了一个增强的@Cache
注释可以让你接触到HTTP验证缓存模型。
而不是写同样的样板代码一次又一次的基本情况:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/ * * *@Route(“/ post / {id}”) *@Cache(smaxage = " 15 ") * /公共函数showAction(请求美元请求,后美元帖子){美元响应=新反应();美元响应- >setLastModified (美元帖子- >getUpdated ());如果(美元响应- >isNotModified (美元请求)){返回美元响应;}/ /……}
您可以配置所有的注释,而不是(这适用于etag):
1 2 3 4 5 6 7 8
/ * * *@Route(“/ post / {id}”) *@Cache(smaxage =“15”, lastModified = " post.getUpdatedAt ()) * /公共函数showAction(文章美元帖子){/ /……}
路由
开箱即用的,Symfony只能匹欧宝娱乐app下载地址配传入请求基于一些预先确定的变量(如路径信息,方法,计划,…),但是有些人希望能够匹配一些更复杂的逻辑,基于请求的其他信息。
覆盖了那些“动态”用例,您现在可以使用条件
设置,你可以添加任何通过使用有效的表达式请求
和路由上下文
变量:
1 2 3
你好:路径:/ hello /{名称}条件:“context.getMethod()[‘得到’,‘头’]和request.headers.get(“用户代理”)= ~ / firefox /我”
再次,当使用URL匹配器PHP翻斗车,没有在运行时开销的条件是纯PHP编译:
1 2 3 4 5 6 7
/ /你好如果(0= = =(大小写敏感美元pathinfo,' /你好'& & preg_match ()“# ^ / hello / (? P <名称>[^ /]+ +)$ #年代,美元pathinfo,美元匹配)& & (in_array (美元上下文- >getMethod (),数组(0= >“获得”,1= >“头”)& & preg_match (“/ firefox /我”,美元请求- >头- >get (“用户代理”)))){返回美元这- >mergeDefaults (array_replace (美元匹配,数组(“_route”= >“你好”)),数组());}
谨慎
时警告说,条件没有考虑到生成的URL。
验证
新表达式
约束可以使用一个表达式来验证一个属性:
1 2 3 4 5 6 7 8 9 10 11 12
使用欧宝娱乐app下载地址\组件\验证器\约束作为断言;/ * * *@Assert\表达式(“this.getFoo() = =‘佛’”,消息=“不好! ")* /类Obj{公共函数getFoo(){返回“foo”;}}
的表达,这
当前被确认的对象的引用。
业务规则引擎
除了使用组件框架本身,表达式语言组件是一个完美的候选人的基础业务规则引擎。这个想法是为了让一个网站的站长配置在一个动态的方式不使用PHP和不引入安全问题:
1 2 3 4 5 6 7 8
#获取特价如果user.getGroup () (“good_customers”、“合作者”)# article.commentCount时促进文章首页> 100条。类别不(misc”) # product.stock时发送警报<15
这是最后一个职位我将发布关于在Symfony 2.4即将到来的新特性。欧宝娱乐app下载地址下一步将是第一个Symfony 2.4的发布候选版本在几天。欧宝娱乐app下载地址
评论
评论都关门了。
以确保评论保持相关,他们关闭了旧的帖子。
理解语法是伟大的我希望我们能在将来获得更复杂的结构。
我喜欢这个想法本身,尤其是对边界情况例如业务规则引擎或代码特别的dsl。另一个用例可能是基于用户输入的规则,这是很难建立,同时保持它安全的代码注入。
我不喜欢暴露的例子在这里,这很可能是被关闭在PHP中,这是魔法和容易遵循/理解。
集成这个引擎在注释/配置对我似乎是一个错误,我一个人很“神奇”。
比实际更多的开发者pr0n帮助,尤其是当我们要调试这些东西。
我只是看到更多虐童案件比用例…
相对于我喜忧参半的组件。我不明白为什么它被添加到树枝
也许应该
{%如果表达式(“has_role (" FOO ")) %}
而不是
{%如果is_granted(表达式(“has_role (" FOO "))) %}
Pierre Minnieur is a certified Symfony engineer.
Get certified! Online exams available in all countries.
Register Now