PHP: $application->post('/({id:\d+})?', HomeHandler::class); $application->post('/?{id:\d+}?', HomeHandler::class); $application->post('/{id:\d+}?', HomeHandler::class); Все три работают, какой правильный? p.s. помню, что ? делает необязательным группу, но все варианты работают
Это ж не обычная регулярка. В обычной именованные подмаски задаются при помощи ?P<name> (и т.п., например P сейчас не обязательно писать). Сама подмаска (любая) пишется в круглых скобках. ? – это не про жадность, а про наличие, как писал ТС, т.е. «0 или 1» элемент/символ. Про жадность, точнее про нежадность, – это +?, *? и ??
Да, ? - это не только про жадность. Но в контексте данной ветки - про жадность. Необязательность обеспечивается другими квантификаторами. Либо *... Либо {m,n}. Но этот вариант обязателен только в случае если есть количественные ограничения.
Ещё, конечно, ? как квантификатор применяется, 0 или 1 символ. Но, опять-таки - не в контексте данной ветки с id, не ограниченным 9-ю цифрами
вот я от обычной и хотел избавиться, в матчере у меня сейчас PHP: $pattern = preg_replace('~{([a-z]+):([^}]+)}~', '(?P<$1>$2)', $route->getPattern()); есть вариант в роуте сделать параметр необязательным? или оставить как было РАНЬШЕ PHP: $application->post('/(?P<id>\d+)?', HomeHandler::class)->addMiddleware(RedirectToAuth::class); и не конвертировать ничего? не хочу делать так PHP: $application->post('home', '/{id}', HomeHandler::class, [ 'id' => '\d+' ])->addMiddleware(RedirectToAuth::class); пока что...
Разведи / и /<id> между двумя роутами и не парься. Обычно даже на более глубоком уровне разводят. --- Добавлено --- Хотя в наших движках часто бывает и по два режима, когда роутер не различает /cat и /cat/obj при вызове контроллера/экшина --- Добавлено --- Фишка в том, что в /cat тоже есть obj, но пустой (пустая строка).