Laravel: фильтрация роутов

Ромчик
0

Доброго времени суток. Очень часто нам приходится фильтровать роуты в Laravel. Например, когда мы мы записываем роут «/user/show/{id}» в качестве id мы хотим принимать только числа. Дальше мы рассмотрим, как это сделать с помощью регулярных выражений.

Допустим у нас есть такой маршрут:


Route::get('/user/show/{id}', 'UserController@show');

И наш метод show контролера User принимает в качестве id только числовые данные. И чтобы не  было ошибки нам нужно делать проверку, что id является числом. Есть несколько вариантов, как это сделать. Не будем на этом останавливаться.

Фильтрация параметра в роуте с помощью регулярного выражения.

Но есть и другой способ, фильтровать параметр id прямо в роуте с помощью регулярного выражения. Для этого у нас есть метод were(<проверяемый параметр>, <условие>).

Так, наш роут с проверкой будет такой:


Route::get('/user/show/{id}', 'UserController@show')

->where('id', '[0-9]+');

Вот и все.

А если нам нужно проверить несколько параметров?

Например:


Route::get('/user/action/{id}/{action}', 'UserController@show');

Где id – может быть только числом, а action состоять только из букв. В этом случае наш роут будет выглядеть так:


Route::get('/user/action/{id}/{action}', 'UserController@show')

-> where(['id' => '[0-9]+', 'action' => '[A-Za-z]+']);

Т.е. в метод where мы передали массив данных, где ключ – это проверяемый параметр, а значение – это регулярное выражение.

Вот еще один кейс: рассмотрим роут, который описан выше, только id – принимает только числовое значение, а action может принимать только два слова blocked и unblocked.

Тогда наш роут будет следующим:


Route::get('/user/action/{id}/{action}', 'UserController@show')

-> where(['id' => '[0-9]+', 'action' => 'blocked|unblocked']);

Мы видим, что фильтровать в роутах запросы очень просто. Но мы пойдем дальше. А что, если мы хотим, чтобы параметр id во всех роутах, где он есть должен принимать только числовое значение? Писать во всех ротах проверку, как мы делали выше? Нет, не вариант. Точнее да можно так делать, но для нас «ленивых» программистов.

Создание паттерна фильтрации параметра в роуте.

Для того, чтобы создать паттерн проверки параметра необходимо перейти в app\Providers\RouteServiceProvider.php и в метод boot добавить:


public function boot()

{

Route::pattern('id', '[0-9]+');

parent::boot();

}

Теперь везде, где есть параметр id он будет проходить проверку. Здорово.

Ну вот и все.

Заключение.

Мы с вами рассмотрели, как фильтровать параметры в роутах с помощью регулярных выражений. Как создать паттерн фильтрации параметра,  чтобы не указывать ее в каждом роуте.

Понравилась статья? Поделись с друзьями.
  • Add to favorites
  • Добавить ВКонтакте заметку об этой странице
  • Twitter
  • Facebook
  • Мой Мир
  • LiveJournal
  • Одноклассники
  • Блог Я.ру
  • MySpace
  • FriendFeed
  • В закладки Google
  • Google Buzz
  • Яндекс.Закладки
  • Reddit
  • StumbleUpon
  • Technorati
  • del.icio.us
  • БобрДобр
  • LinkedIn
  • Memori.ru
  • Сто закладок
  • Blogger

©2012-2019 По всем вопросам обращайтесь через форму обратной связиПолитика конфиденциальности

Яндекс.Метрика