【问题标题】:How to validate a symfony expression language expression如何验证 symfony 表达式语言表达式
【发布时间】:2016-05-11 17:22:15
【问题描述】:

我正在制作一个用户可以输入他们自己的表达方式的系统。 我有searched 所有ofinternet,我似乎找不到如何在执行之前验证用户输入的表达式的示例。

是否有“标准方式”或“最佳实践”来验证用户输入的表达式,还是我必须自己进行验证?

编辑

我只是想让用户过滤一个表(数组),所以我猜表达式不会过于复杂。

所以对于带有 array('id', 'firstName', 'lastName', 'docId', 'profit'); 之类标题的数组,我期待这样的表达式:row.id < 2 and row.profit <= 500

【问题讨论】:

  • 我取决于您的“表达式”有多复杂,最简单的情况可以使用正则表达式进行验证,对于复杂的情况,您需要构建状态机(或使用外部库)。你给我们举几个例子怎么样?
  • hmm ,所以我想你并不真的需要处理复杂的表达式,所以我认为在你的情况下更好的解决方案是为用户提供更严格的基于客户端(javascript)的过滤器,他将从数组中选择(表)列、运算符和值...(他可以添加更多这些过滤器)

标签: php validation symfony


【解决方案1】:

Symfony/ExpressionLanguage 包有一个SyntaxError 类,如果表达式中存在错误则抛出此异常。

控制错误:

use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
use Symfony\Component\ExpressionLanguage\SyntaxError;

$expressionLanguage = new ExpressionLanguage();

try {
    $expressionLanguage->evaluate('1 + b.foo');
} catch (SyntaxError $e) {
    // Error
}

但是,我们不能通过类型来控制错误:

  1. 语法无效
  2. 未找到变量
  3. 意外的令牌
  4. 找不到函数
  5. 等等……

作为解决方案(坏主意),您可以通过异常中的文本来控制类型。

【讨论】:

  • 附注:从 Symfony 4.2 开始,SyntaxError 类仍然存在,但使用/抛出了 RuntimeException
猜你喜欢
  • 2015-06-14
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
  • 2012-04-17
  • 2014-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多