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
Ответы
Ответ 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 : '';
Помогите вашей проблеме