2016-09-13 8 views
0

У меня есть простой конец API точка устанавливается следующим образом:требования @QueryParam Regex не работает, как ожидалось

/** 
* 
* @QueryParam(name="originLat", requirements="\d+", strict=true, nullable=false) 
* @QueryParam(name="originLng", strict=true, nullable=false) 
* @QueryParam(name="departureTime", requirements="/\d{4}-[01]\d-[0-3]\d [0-2]\d:[0-5]\d:[0-5]\d/", strict=true, nullable=false) 
* 
* @param ParamFetcher $paramFetcher 
*/ 
public function getWalkingJourney(ParamFetcher $paramFetcher) 
{ 
    $dTime = $paramFetcher->get('departureTime'); 
    $oLat = $paramFetcher->get('originLat'); 
    $oLng = $paramFetcher->get('originLng'), 
} 

код [QueryParam] [1] для originLat работает нормально, если я прохожу простое число, но более сложный departureTime регулярное выражение всегда терпит неудачу со следующим сообщением:

Parameter "departureTime" of value "2016-09-13 14:47:36" violated a constraint "Parameter 'departureTime' value, does not match requirements '/\d{4}-[01]\d-[0-3]\d [0-2]\d:[0-5]\d:[0-5]\d/'" 

который кажется счетчик интуитивно, так как это правильное регулярное выражение.

Я делаю что-то неправильно здесь?

+0

Параметр 'QueryParam' регулярное выражение могут быть заданы в виде строки. Нет необходимости включать в '/' –

ответ

0

Вы добавляете PCRE delimiters в requirements, что, скорее всего, испортит ваше регулярное выражение.

Try, как * @QueryParam(name="departureTime", requirements="\d{4}-[01]\d-[0-3]\d [0-2]\d:[0-5]\d:[0-5]\d", strict=true, nullable=false)

+0

К сожалению, проблема все еще сохраняется: Параметр «departureTime» значения «2016-09-13 15:05:01» нарушил ограничение «Параметр« Исходное время », не соответствует требованиям '\ d {4} - [01] \ d- [0-3] \ d [0-2] \ d: [0-5] \ d: [0-5] \ d '" – JackalopeZero

+0

Ну, регулярное выражение проверяет образец которые вы предоставляете. Проблема, вероятно, заключается в том, что вход не является тем, что вы думаете. Используйте 'var_dump()' на вкладке, чтобы проверить его дальше. Вероятно, есть некоторые пробелы, которые вы не замечаете, потому что вы, вероятно, смотрите на них в своем браузере или есть непечатаемый персонаж, которого вы не видите на консоли. 'var_dump()' даст вам длину строки, чтобы это стало более очевидным. – Sherif

+0

Im делает TDD, поэтому я контролирую точно, что происходит. Im также использует xdebug, поэтому я вижу, что переменная такая же, как ожидалось в контроллере. По какой-то причине это проблема с единственным пространством. – JackalopeZero

0

Проблема здесь была пространством проблема. Аннотации не обрабатывают пробелы хорошо, поэтому, когда пространство в регулярном выражении было заменено на \ s, все работает отлично.

Не работает

* @QueryParam(name="departureTime", requirements="\d{4}-[01]\d-[0-3]\d [0-2]\d:[0-5]\d:[0-5]\d", strict=true, nullable=false)  * 

Работы

* @QueryParam(name="departureTime", requirements="\d{4}-[01]\d-[0-3]\d\s[0-2]\d:[0-5]\d:[0-5]\d", strict=true, nullable=false)  * 
+1

Звучит как серьезный винт на стороне Symfony. Разбор докблока тривиален. Он встроен в PHP. Но не зная, как правильно обрабатывать парсинг цитируемых строк внутри аннотации ... это означает, что Symfony не работает при программировании 101 **, если честно. – Sherif

+0

Согласовано. Я следовал за кодом в свою библиотеку проверки, где он манипулировал регулярными выражениями, добавляющими и добавляющими символами. Я не совсем уверен, что он делает там tbh, Im no regex expert, но он определенно не остается чистым до момента проверки. – JackalopeZero

+1

Сообщить об ошибке в отношении доктрины/аннотаций, если она обнаружена как ошибка в этой реализации. Написание тестового примера кажется тривиальным, см. Https://github.com/doctrine/annotations/tree/f9cf50745a45cae4a55f35e7691d124c4d887e45/tests/Doctrine/Tests/Common/Annotations/Fixtures – Ocramius