Проверка данных POST без модели в Silex/Symfony 2?

Я создаю приложение RESTful, которое будет обслуживать только данные json/xml, и я выбрал Silex, потому что я уже знаю (немного) Symfony 2 и потому что он маленький, мне не нужен Twig и т. д.

Здесь нет моделей, просто старые SQL-запросы с использованием Doctrine dbal и сериализатора. В любом случае, я должен проверять запросы POST/PUT. Как это можно сделать без использования компонента формы и моделей?

Я имею в виду, что данные POST представляют собой массив. Могу ли я проверить это (добавление ограничений) и как?

EDIT: хорошо, прямо сейчас я нашел интересную библиотеку, то есть respect/ проверка. Он также использует ограничения 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);

person gremo    schedule 10.08.2012    source источник
comment
Это уважение выглядит очень хорошо, я мог бы использовать его в моем следующем небольшом проекте.   -  person gunnx    schedule 11.08.2012
comment
Не могли бы вы опубликовать своего поставщика услуг Respect для Silex?   -  person gunnx    schedule 11.08.2012
comment
Думали ли вы об использовании Symfony ValidatorServiceProvider, который также способен проверять ассоциативные массивы: silex.sensiolabs.org/doc/providers/   -  person Davincho    schedule 27.12.2014


Ответы (3)


Ну, вы можете проверить массив с помощью компонента 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;
  }
person Mun Mun Das    schedule 11.08.2012
comment
Можно ли использовать UniqueEntity внутри этой коллекции ограничений? - person tomloprod; 04.10.2016
comment
Я хочу пропустить какое-то поле из проверки... но получаю сообщение об ошибке. Это поле не ожидается. Как это преодолеть. - person Anil Gupta; 30.10.2017

Если вы хотите создать API с Symfony2 (по аналогии с silex), здесь есть хороший учебник: http://williamdurand.fr/2012/08/02/rest-apis-with-symfony2-the-right-way/

Лучший способ проверить отправленные значения на silex — это по-прежнему использовать проверку & < компоненты href="http://silex.sensiolabs.org/doc/providers/form.html" rel="nofollow">form (с моделью) ! Они созданы для этого! Прочитайте полный слайд, созданный Хьюго Хамоном, чтобы создать свой API с помощью silex! http://www.slideshare.net/hhamon/silex-meets-soap-rest (проверьте страницу 42 для проверки)

Не проверяйте один за другим отправленные элементы в действии.

Делая это, вы сохраните свой код чистым и развивающимся!

person Sybio    schedule 10.08.2012
comment
Мне не нужен компонент формы, так как это REST, это просто данные. Не знаю насчет моделей... я не хочу использовать форму доктрины... я думаю, что в этом нет необходимости. - person gremo; 11.08.2012
comment
Вы можете просто использовать модели (без доктрины), просто для использования компонентов проверки (с утверждением) для сущностей, это более эволюционно и читабельно ^^ - person Sybio; 12.08.2012

Это довольно хорошо объяснено в книге Symfony здесь: http://symfony.com/doc/master/book/forms.html#adding-validation

person guillaumepotier    schedule 10.08.2012
comment
Не нужны формы и нет моделей. - person gremo; 11.08.2012
comment
Я также создаю RESTFull API поверх Symfony2. Для проверки параметров POST/PUT моего API я создаю формы, чтобы использовать великолепную проверку Sf2, построенную поверх этого. Взгляните на этот замечательный пост о создании отличного REST Api на Symfony2: williamdurand.fr/2012/08/02/ - person guillaumepotier; 11.08.2012