Symfonyob娱乐下载 2.4新增功能:ExpressionLanguage组件
警告:这篇文章是关于一个不受支持的Symfony版本。ob娱乐下载有些信息可能已经过时了。阅读最新的Symfony文档ob娱乐下载.
ob娱乐下载Symfony 2.4带来了一个新组件:ExpressionLanguage.ExpressionLanguage提供了一个编译和计算表达式的引擎。
语言它只是一个精简版的Twig表达式。因此,表达式是返回值的一行代码(主要是布尔值,但不限于此)。
与Twig不同,ExpressionLanguage有两种工作模式:
- 编译:表达式被编译为PHP以供以后计算(注意,编译后的PHP代码会这样做不依赖运行时环境);
- 评价:表达式被求值而不被首先编译成PHP。
为了能够在不需要运行时环境的情况下将表达式编译为普通PHP字符串,可以使用.
操作符调用必须是显式的,以避免任何歧义:foo.bar
对于对象属性,foo['酒吧')
对于数组调用,和foo.getBar ()
用于方法调用。
使用该组件非常简单:
1 2 3 4 5 6 7 8 9
使用ob娱乐下载\组件\ExpressionLanguage\ExpressionLanguage;$语言=新ExpressionLanguage ();回声$语言->评估(“1 + 1”);//返回2回声$语言->编译(“1 + 2”);//返回"(1 + 2)"
该语言支持Twig在表达式中支持的所有内容:数学运算符、字符串、数字、数组、哈希值、布尔值……
表达式可以被视为一个非常受限的PHP沙盒,并且不受外部注入的影响,因为在编译或求值时必须显式地声明表达式中哪些变量是可用的:
1 2 3
$语言->评估(“a.b”,数组(“一个”= >新stdClass ()));$语言->编译(“a.b”,数组(“一个”));
最后但并非最不重要的是,你可以很容易地通过函数扩展语言;它们的工作方式与Twig对应的相同(参见注册()
方法获取更多信息。)
那么一些用例呢?我们能够在许多不同的其他内置Symfony组件中利用新组件。ob娱乐下载
服务容器
你可以在服务容器中传递参数的任何地方使用表达式:
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() or has_role('ROLE_ADMIN')"}
该规则限制以/ _internal /安全
对于从localhost浏览的人;请求
,令牌
而且用户
变量是否可以访问和is_anonymous ()
,is_authenticated ()
,is_fully_authenticated ()
,is_rememberme ()
,has_role ()
是在此上下文中定义的函数。
你也可以在Twig模板中使用new表达式
功能:
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版bundle的一部分,在Symfony 2.4最终版之前发布。ob娱乐下载
缓存
版本3的sensioframeworkextrabundance也带有一个增强的@Cache
注释,它允许您访问HTTP验证缓存模型。
而不是一遍又一遍地为基本情况编写相同的样板代码:
12 3 4 5 6 7 8 9 10 11 12 13 14
/ * * *@Route(“/ post / {id}”)*@Cache(smaxage = " 15 ") * /公共函数showAction(请求$请求,后$帖子){$响应=新反应();$响应->setLastModified ($帖子->getUpdated ());如果($响应->isNotModified ($请求)) {返回$响应;}/ /……}
你可以在注释中配置所有内容(这也适用于ETags):
1 2 3 4 5 6 7 8
/ * * *@Route(“/ post / {id}”)*@Cache(smaxage="15", lastModified="post.getUpdatedAt()") */公共函数showAction(文章$帖子){/ /……}
路由
开箱即用,Symfony只能基于ob娱乐下载一些预先确定的变量(如路径信息、方法、方案等)匹配传入的请求,但是有些人希望能够基于请求的其他信息匹配一些更复杂的逻辑。
为了涵盖那些更“动态”的用例,现在可以使用条件
属性添加任何有效表达式,该属性允许您使用请求
还有路由上下文
变量:
1 2 3
你好:路径:/ hello /{名称}条件:"context.getMethod() in ['GET', 'HEAD'] and request.headers.get('User-Agent') =~ '/firefox/i'"
同样,当使用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时不考虑条件。
验证
新表达式
Constraint允许您使用表达式来验证属性:
12 3 4 5 6 7 8 9 10 11 12
使用ob娱乐下载\组件\验证器\约束作为断言;/ * * *@Assert\表达式(“this.getFoo() = =‘佛’”,消息=“不好! ")* /类Obj{公共函数getFoo(){返回“foo”;}}
表达式中,这
引用正在验证的当前对象。
业务规则引擎
除了在框架本身中使用组件外,表达式语言组件是一个完美的候选业务规则引擎.这个想法是让网站管理员在不使用PHP和不引入安全问题的情况下,以动态的方式配置内容:
1 2 3 4 5 6 7 8
#当article. commentcount > 100和article. getgroup()在['good_customers', 'collaborator']中获得特价类别不在["misc"] #当product.stock . #<15
这是我关于Symfony 2.4即将发布的新特性的最后一篇文章。ob娱乐下载下一步将在几天后发布第一个Symfony 2.4候选版本。ob娱乐下载
评论
评论截止。
为了确保评论保持相关性,旧帖子将被关闭。
树枝语法很棒,我希望我们将来能有机会使用更复杂的结构。
我喜欢这个想法本身,特别是对于边缘情况,如业务规则引擎或例如编写特殊的dsl。另一个用例可能是基于用户输入的规则,这是很难构建的,同时要保证它不受代码注入的影响。
不过,我不喜欢这里的示例,它们很可能被PHP中的闭包所取代,闭包不那么神奇,更容易遵循/理解。
在注释/配置中集成这个引擎对我来说似乎是一个错误,我是一个非常习惯“魔法”的人。
它更像是开发人员的pr0n而不是实际的帮助,特别是当我们必须调试这些东西的时候。
我只是看到滥用案例比使用案例更多……
关于这个组件,我有复杂的感觉。我不明白为什么要把它加到树枝上
也许它应该是
{% if表达式('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