Подтвердить что ты не робот

Symfony - проверка значений параметров пустых запросов

Я использую FOSRestBundle и задавался вопросом, можно ли проверять на пустые параметры запроса с помощью аннотаций?

Например, при вызове: /comments/1 создается исключение, поскольку параметры запроса dealId и source не установлены.

Однако вызов /comments/1?dealId=1&source= хорош, даже если значение source не установлено ben и не соответствует регулярному выражению, указанному в аннотации.

Функция контроллера:

/**
 * Get a single comment.
 *
 * @Annotations\QueryParam(name="dealId", requirements="\d+", strict=true, description="The deal the comments belong to.")
 * @Annotations\QueryParam(name="source", requirements="(forum|blog)", strict=true, description="The source of the comments.")
 *
 * @Annotations\View()
 *
 * @Annotations\Get("/comments/{id}", requirements={"id" = "\d+"})
 *
 */
public function getCommentAction(Request $request, ParamFetcherInterface $paramFetcher, $id)
{
    $dealId = $paramFetcher->get('dealId');
    $source = $paramFetcher->get('source');

    // TODO: Implement


    return [ 'id' => $id, 'dealId' => $dealId, 'source' => $source ];
}

Обновление

Я поднял эту проблему в репозитории FOSRestBundle GitHub, и похоже, что то, что я прошу, в настоящее время невозможен из-за ограничений используемого валидатора Regex.

https://github.com/FriendsOfSymfony/FOSRestBundle/issues/814#issuecomment-49696288

4b9b3361

Ответ 1

Просто используйте параметр allowBlank для QueryParam. В вашем случае вы установите для allowBlank значение false для получения ожидаемого поведения:

Параметр allowBlank не является YET в FOSRestBundle, но я предоставил патч для FOSRestBundle, который имеет хорошие шансы приземлиться в следующем выпуске версии 1.5.0.. p >

Вот как выглядит ваш контроллер:

/**
 * Get a single comment.
 *
 * @Annotations\QueryParam(name="dealId", requirements="\d+", strict=true, description="The deal the comments belong to.")
 * @Annotations\QueryParam(name="source", requirements="(forum|blog)", strict=true, allowBlank=false, description="The source of the comments.")
 *
 * @Annotations\View()
 *
 * @Annotations\Get("/comments/{id}", requirements={"id" = "\d+"})
 *
 */
public function getCommentAction(Request $request, ParamFetcherInterface $paramFetcher, $id)
{
    $dealId = $paramFetcher->get('dealId');
    $source = $paramFetcher->get('source'); 
}

Ответ 2

Если вы хотите, чтобы ваши параметры были проверены, вы можете изменить файл конфигурации, как описано в документации. Вот пример:

fos_rest: param_fetcher_listener: force

Затем вы можете установить другие параметры, например, strict, nullable.

Подробнее см. здесь:

http://symfony.com/doc/current/bundles/FOSRestBundle/configuration-reference.html

Ответ 3

@Annotations\QueryParam ожидает, что параметр nullable будет установлен (true или false), если используется параметр strict. Попробуйте настроить его.

Я думаю, вы хотите:

@Annotations\QueryParam(name="dealId", requirements="\d+", strict=true, nullable=false, description="The deal the comments belong to.")
@Annotations\QueryParam(name="source", requirements="(forum|blog)", strict=true, nullable=false, description="The source of the comments.")

Также читайте больше о QueryParam в docs.

Ответ 4

Сложная часть позволяет source и dealId быть пустым, но я думаю, что это возможно добавив эти параметры к вашему маршруту (поэтому они должны быть указаны для доступа к контроллеру) и с использованием префикса строки для каждого параметра (т.е. dealid_ и source_), поэтому можно указать пустое значение.

Вам также потребуется изменить требования к регулярному выражению, чтобы разрешить пустые значения.

/**
 * Get a single comment.
 *
 * @Annotations\View()
 * @Annotations\Get("/comments/{id}/dealid_{dealId}/source_{source}", 
 *    requirements={"id" = "\d+", "dealId" = "\d*", "source" = "(forum|blog)*"})
 */
public function getCommentAction(Request $request, 
    ParamFetcherInterface $paramFetcher, $id, $dealId, $source) 
{
    return [ 'id' => $id, 'dealId' => $dealId, 'source' => $source ];
}

Ответ 5

Я не знаком с symfony, но я думаю, что простой

$dealId = isset($dealId) ? $dealId : '';

Помогите вашей проблеме