Laravel довольно мощный фреймворк, который имеет множество встроенных методов для проектирования веб-приложения. Одним из фундаментальных инструментов является функционал построения маршрутов приложения.
Маршруты, они же «роуты» очень удобно использовать при написании логики приложения, а также при необходимости вывода URL путей в представлении (шаблонах) приложения. Важной частью построения маршрутов в Laravel является возможность передачи параметров в URL. Содержать маршруты могут как обязательные параметры так и необязательные. К значениям обязательных параметров довольно часто требуется наложить ограничения. Чтобы пользователь мог передавать только параметры заданного формата.
Для этих целей в классе для построения маршрутов существует метод where. Этот метод может принимать регулярные выражения для проверки передаваемых параметров. Делается это конечно же для корректной работы веб-приложения, ну и безопасности в том числе.
Рассмотрим простой пример:
Route::get('/post/{id}', function ($id) { return 'ID поста: ' . $id; })->where('id', '[0-9]+');
Так мы задали ограничение для параметра id. По условию он может содержать только символы от 0 до 9. Аналогичным образом, мы можем задавать ограничения на несколько параметров.
Route::get('/post/{section_code}/{id}', function ($section_code, $id) { return 'Раздел: ' . $section_code . ', ID поста: ' . $id; })->where('section_code', '[a-z0-9_-]+')->where('id', '[0-9]+');
Как вы понимаете регулярные выражения могут меняться вами как вам требуется. Для простых и распространённых случаев, например числовых или символьных значений существуют готовые методы, которые избавляют от потребности писать регулярные выражения для каждого маршрута.
Для ограничения значения параметра только по числовым значениям может быть использован метод whereNumber.
Route::get('/post/{id}', function ($id) { // })->whereNumber('id');
Чтобы ограничить параметр только по буквам алфавита, можно воспользоваться методом whereAlpha.
Route::get('/post/{section_code}', function ($section_code) { // })->whereAlpha('section_code');
Существует метод, который допускает к использованию только букв и цифр.
Route::get('/post/{post_code}', function ($post_code) { // })->whereAlphaNumeric('post_code');
Каждый из приведённых методов позволяет настраивать маршруты приложения согласно требованиям проекта. Существуют типовые параметры, которые часто повторяются в разных маршрутах. Например, тот же параметр «id». Для этих случаев бывает удобно задать ограничение глобально. При большом количестве маршрутов это избавляет от необходимости прописывания правил проверки для каждого маршрута.
В файле App\Providers\RouteServiceProvider.php в методе boot необходимо прописать правило:
public function boot() { Route::pattern('id', '[0-9]+'); }
Это ограничение будет распространяться на все маршруты, где есть параметр id. Поэтому прописывать ограничение для отдельных маршрутов в этом случае нет необходимости:
Route::get('/post/{id}', function ($id) { return 'ID поста: '.$id; // сработает, если id - числовое значение });
Использование глобальных ограничений позволяет сократить так же время на написание правил проверки параметров маршрутов. Это особенно актуально, когда проект масштабный, и содержит большое количество однотипных правил.