6

私はjson/xmlデータのみを提供するRESTfulアプリケーションを構築しています.Symfony 2を(少し)知っているので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 ページを確認してください)

アクションで送信された要素を 1 つずつ検証しないでください。

これにより、コードをクリーンで進化的に保つことができます。

于 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 に答える