6

我正在构建一个仅提供 json/xml 数据的 RESTful 应用程序,我选择了 Silex,因为我已经(有点)了解 Symfony 2 并且因为它很小,所以我不需要 Twig 等...

没有模型,只有使用 Doctrine dbal 和序列化程序的普通旧 SQL 查询。无论如何,我应该验证 POST/PUT 请求。在不使用表单组件和模型的情况下如何做到这一点?

我的意思是 POST 数据是一个数组。我可以验证它(添加约束)吗?如何验证?

编辑:好的,现在我找到了一个有趣的库,即尊重/验证。如果需要,它还使用 sf 约束。我最终得到了这样的东西(早期代码:P),如果没有更好的东西我会使用它:

$v = $app['validation.respect'];

$userConstraints = array(
    'last'     => $v::noWhitespace()->length(null, 255),
    'email'    => $v::email()->length(null, 255),
    'mobile'   => $v::regex('/^\+\d+$/'),
    'birthday' => $v::date('d-m-Y')->max(date('d-m-Y')),
);

// Generic function for request keys intersection
$converter = function(array $input, array $allowed)
{
    return array_intersect_key($input, array_flip($allowed));
};

// Convert POST params into an assoc. array where keys are only those allowed
$userConverter = function($fields, Request $request) use($converter) {

    $allowed = array('last', 'email', 'mobile', 'birthday');

    return $converter($request->request->all(), $allowed);
};

// Controller
$app->match('/user', function(Application $app, array $fields)
    use($userConstraints) {

    $results = array();

    foreach($fields as $key => $value)
        $results[] = $userConstraints[$key]->validate($value);

})->convert('fields', $userConverter);
4

3 回答 3

13

好吧,您可以使用 Symfony2 Validator 组件验证数组,例如

//namespace declaration    
use Symfony\Component\Validator\Constraints\Collection;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Constraints\Date;
use Symfony\Component\Validator\Constraints\NotBlank;
//....

 //validation snippet

  $constraint = new Collection(array(
    'email' => new Email(),
    'last'  => new NotBlank(),
    'birthday' => new Date(),
  ));

  $violationList = $this->get('validator')->validateValue($request->request->all(), $constraint);

  $errors = array();
  foreach ($violationList as $violation){
    $field = preg_replace('/\[|\]/', "", $violation->getPropertyPath());
    $error = $violation->getMessage();
    $errors[$field] = $error;
  }
于 2012-08-11T14:55:39.050 回答
3

如果您想使用 Symfony2(与 silex 类似)构建 API,这里有一个很好的教程:http ://williamdurand.fr/2012/08/02/rest-apis-with-symfony2-the-right-way/

在 silex 上验证发送值的最佳方法仍然是使用验证表单组件(带模型)!他们被要求执行此操作!阅读由 Hugo Hamon 创建的完整幻灯片,以使用 silex 构建您的 API!http://www.slideshare.net/hhamon/silex-meets-soap-rest(查看第 42 页进行验证)

不要在操作中一一验证发送的元素。

通过这样做,您将保持您的代码干净和不断发展!

于 2012-08-10T23:00:57.907 回答
1

在这里的 Symfony Book 中有很好的解释:http: //symfony.com/doc/master/book/forms.html#adding-validation

于 2012-08-10T22:53:21.680 回答