Symfony 4.4中如何在表达式语言中使用kernel.environment?
解决Symfony 4.4 + Api Platform环境路由权限控制问题
你遇到的问题是因为在表达式语言中,'%kernel.environment%'被当作字符串字面量处理,而非环境变量解析。要正确实现仅在dev/test环境开放路由,有两种可行方案:
方案一:直接使用Symfony全局kernel对象(推荐)
Symfony的安全表达式语言默认注入了kernel全局对象,可直接访问其environment属性。修改Api Platform的实体路由配置:
* "postUserTest"={ * "security" = "kernel.environment !== 'prod'", * "method"="POST",
测试表达式时,需将kernel对象传入表达式语言:
// $env = prod $env = $this->getParameter('kernel.environment'); // 传入kernel对象后,表达式会正确解析环境变量 $result1 = $expressionLanguage->evaluate("kernel.environment === 'prod'", ['kernel' => $this->get('kernel')]); // 此时prod环境下$result1会返回true
方案二:显式传递环境变量参数
如果不想依赖kernel对象,可手动将环境变量作为参数传入表达式:
测试代码示例:
// $env = prod $env = $this->getParameter('kernel.environment'); // 直接传递env参数到表达式中 $result1 = $expressionLanguage->evaluate("env === 'prod'", ['env' => $env]); // prod环境下$result1返回true
关键说明
原写法中'%kernel.environment%'是被引号包裹的字符串,表达式语言不会解析Symfony的参数占位符,只会把它当作普通字符串与'prod'比较,自然返回false。使用kernel.environment则是直接访问内核对象的属性,能正确获取当前环境值。
内容的提问来源于stack exchange,提问作者Jules D.
相关产品推荐
相关产品推荐

