{{TOC}} {{DOCVER 4.0=0da300f6445bec5a70d007f503834fce957b065b 16.10.2014 5:19:26, 4.1=efd541a0b218b1c6aafb73f0051c18ed150e3c24 25.05.2014 6:21:03, 4.2=d7b13440c003218ed79e9d508706eca01990122f 4.12.2014 5:01:15}} == Простейшая маршрутизация == Большинство маршрутов (//routes//) вашего приложения будут определены в файле %%(t)app/routes.php%%. В Laravel, простейший маршрут состоит из URI (пути) и функции-замыкания. **Простейший %%(t)GET%%-маршрут** %% Route::get('/', function () { return 'Hello World'; }); %% **Простейший %%(t)POST%%-маршрут** %% Route::post('foo/bar', function () { return 'Hello World'; }); %% %%(DOCNEW 4.1=efd541a0b218b1c6aafb73f0051c18ed150e3c24 25.05.2014 6:21:03) **Регистрация маршрута для нескольких типов запросов** ~%% Route::match(array('GET', 'POST'), '/', function() { return 'Hello World'; }); ~%% %% **Регистрация маршрута для любого типа HTTP-запроса** %% Route::any('foo', function () { return 'Hello World'; }); %% **Регистрация маршрута, всегда работающего через ((ВП:HTTPS))** %% Route::get('foo', array('https', function() { return 'Must be over HTTPS'; })); %% Вам часто может понадобиться сгенерировать URL к какому-либо маршруту - для этого используется метод %%URL::to()%%: %% $url = URL::to('foo'); %% == Параметры маршрутов == %% Route::get('user/{id}', function ($id) { return 'User '.$id; }); %% **Необязательные параметры маршрута** %% Route::get('user/{name?}', function ($name = null) { return $name; }); %% **Необязательные параметры со значением по умолчанию** %% Route::get('user/{name?}', function ($name = 'John') { return $name; }); %% **Маршруты с соответствием пути регулярному выражению** %% Route::get('user/{name}', function ($name) { // }) ->where('name', '[A-Za-z]+'); Route::get('user/{id}', function ($id) { // }) ->where('id', '[0-9]+'); %% **Передача массива %%where%%-ограничений** Конечно, при необходимости вы можете передать массив ограничений (//constraints//): %% Route::get('user/{id}/{name}', function ($id, $name) { // }) ->where(array('id' => '[0-9]+', 'name' => '[a-z]+')); %% **Регистрация глобальных шаблонов** Если вы хотите, чтобы параметр был всегда ограничен заданным регулярным выражением, то можете использовать метод %%(t)pattern%%: %% Route::pattern('id', '[0-9]+'); Route::get('user/{id}', function($id) { // Вызывается только если {id} числовой. }); %% %%(DOCNEW 4.1=efd541a0b218b1c6aafb73f0051c18ed150e3c24 25.05.2014 6:21:03) **Доступ к значению параметра маршрута** Если вам нужен доступ к значению параметра маршрута извне, то вы можете использовать метод %%Route::input()%%: ~%% Route::filter('foo', function() { if (Route::input('id') == 1) { // } }); ~%% %% == ((#фильтры)) Фильтры маршрутов == Фильтры - удобный механизм ограничения доступа к определённому маршруту, что полезно при создании областей сайта только для авторизованных пользователей. В Laravel изначально включено несколько фильтров, в том числе **auth**, **auth.basic**, **guest** и **csrf**. Они определены в файле %%(t)app/filters.php%%. **Регистрация фильтра маршрутов** %% Route::filter('old', function () { if (Input::get('age') < 200) { return Redirect::to('home'); } }); %% Если фильтр возвращает значение, оно используется как ответ на сам запрос и обработчик маршрута не будет вызван, и все **after**-фильтры тоже будут пропущены. **Привязка фильтра к маршруту** %% Route::get('user', array('before' => 'old', function () { return 'Вам больше 200 лет!'; })); %% **Привязка фильтра к действию контроллера** %% Route::get('user', array('before' => 'old', 'uses' => 'UserController@showProfile')); %% **Привязка нескольких фильтров к маршруту** %% Route::get('user', array('before' => 'auth|old', function () { return 'Вы авторизованы и вам больше 200 лет!'; })); %% %%(DOCNEW 4.1=efd541a0b218b1c6aafb73f0051c18ed150e3c24 25.05.2014 6:21:03) **Привязка нескольких фильтров в виде массива** ~%% Route::get('user', array('before' => array('auth', 'old'), function() { return 'Вы авторизованы и вам больше 200 лет!'; })); ~%% %% **Передача параметров для фильтра** %% Route::filter('age', function ($route, $request, $value) { // }); Route::get('user', array('before' => 'age:200', function () { return 'Привет, мир!'; })); %% Фильтры типа **after** (!!(tl_note) выполняющиеся после запроса, если он не был отменён фильтром **before** - //прим. пер.//!!) получают %%$response%% как свой третий аргумент: %% Route::filter('log', function ($route, $request, $response) { // }); %% === Фильтры по шаблону == Вы можете также указать, что фильтр применяется ко всем маршрутам, URI (путь) которых соответствует шаблону. %% Route::filter('admin', function () { // }); Route::when('admin/*', 'admin'); %% В примере выше фильтр **admin** будет применён ко всем маршрутам, адрес которых начинается с %%(t)admin/%%. Звёздочка (%%(t)*%%) используется как символ подстановки и соответствует любому набору символов, в том числе пустой строке. Вы также можете привязывать фильтры, зависящие от типа HTTP-запроса: %% Route::when('admin/*', 'admin', array('post')); %% === Классы фильтров == Для продвинутой фильтрации вы можете использовать классы вместо замыканий. Так как фильтры создаются с помощью ((docs/v4/ioc IoC-контейнера)), то вы можете положиться на его внедрение зависимостей для лучшего тестирования. %%(DOCNEW 4.1=efd541a0b218b1c6aafb73f0051c18ed150e3c24 25.05.2014 6:21:03) **Регистрация фильтра-класса** ~%% Route::filter('foo', 'FooFilter'); ~%% По умолчанию будет вызван метод %%filter()%% на класс %%FooFilter%%: ~%% class FooFilter { public function filter() { // Код логики фильтра... } } ~%% Если вы не хотите использовать метод %%filter()%%, просто укажите другой метод: ~%% Route::filter('foo', 'FooFilter@foo'); ~%% %% == Именованные маршруты == Присваивая имена маршрутам вы можете сделать обращение к ним (при генерации URL или переадресациях) более удобным. Вы можете задать имя маршруту таким образом: %% Route::get('user/profile', array('as' => 'profile', function () { // })); %% Также можно указать ((docs/v4/controllers контроллер)) и его //действие//: %% Route::get('user/profile', array('as' => 'profile', 'uses' => 'UserController@showProfile')); %% Теперь вы можете использовать имя маршрута при генерации URL или переадресации: %% $url = URL::route('profile'); $redirect = Redirect::route('profile'); %% Получить имя текущего выполняемого маршрута можно методом %%currentRouteName()%%: %% $name = Route::currentRouteName(); %% == Группы маршрутов == Иногда вам может быть нужно применить фильтры к набору маршрутов. Вместо того, чтобы указывать их для каждого маршрута в отдельности вы можете сгруппировать маршруты: %% Route::group(array('before' => 'auth'), function () { Route::get('/', function () { // К этому маршруту привязан фильтр auth. }); Route::get('user/profile', function () { // К этому маршруту также привязан фильтр auth. }); }); %% %%(DOCNEW 4.1=efd541a0b218b1c6aafb73f0051c18ed150e3c24 25.05.2014 6:21:03) Вы также можете использовать параметр %%namespace%% для вашего массива %%group%%, чтобы указать, что все контроллеры этой группы находятся в данном пространстве имен: ~%% Route::group(array('namespace' => 'Admin'), function() { // }); ~%% %% === Доменная маршрутизация == Маршруты Laravel способны работать и с поддоменами по их маске и передавать в ваш обработчик параметры из шаблона. **Регистрация маршрута по поддомену** %% Route::group(array('domain' => '{account}.myapp.com'), function () { Route::get('user/{id}', function ($account, $id) { // }); }); %% === Префикс пути == Группа маршрутов может быть зарегистрирована с одним префиксом без его явного указания с помощью ключа **prefix** в параметрах группы: %% Route::group(array('prefix' => 'admin'), function () { Route::get('user', function () { // }); }); %% == Привязка моделей == Привязка моделей - удобный способ передачи экземпляров моделей в ваш маршрут. Например, вместо передачи ID пользователя вы можете передать модель %%User%%, которая соответствует данному ID, целиком. Для начала используйте метод %%Route::model()%% для указания модели, которая должна быть использована вместо данного параметра. **Привязка параметра к модели** %% Route::model('user', 'User'); %% Затем зарегистрируйте маршрут, который принимает параметр %%(t){user}%%: %% Route::get('profile/{user}', function (User $user) { // }); %% Из-за того, что мы ранее привязали параметр %%(t){user}%% к модели %%User%%, то её экземпляр будет передан в маршрут. Таким образом, к примеру, запрос %%(t)profile/1%% передаст объект %%User%%, который соответствует ID 1 (!!(tl_note)полученному из БД - //прим. пер.//!!). .(alert) **Внимание:** если переданный ID не соответствует строке в БД будет возбуждено **((#404 исключение 404))**. Если вы хотите задать свой собственный обработчик для события "не найдено", вы можете передать функцию-замыкание в метод %%model()%%: %% Route::model('user', 'User', function () { throw new NotFoundHttpException; }); %% Иногда вам может быть нужно использовать собственный метод для получения модели перед её передачей в маршрут. В этом случае просто используйте метод %%Route::bind()%%: %% Route::bind('user', function ($value, $route) { return User::where('name', $value)->first(); }); %% == ((#404)) Ошибки 404 == Есть два способа вызвать исключение 404 (//Not Found//) из маршрута. Первый - методом %%App::abort()%%: %% App::abort(404); %% Второй - возбудив исключение класса или потомка класса %%Symfony\Component\HttpKernel\Exception\NotFoundHttpException%%. Больше информации о том, как обрабатывать исключения 404 и отправлять собственный ответ на такой запрос содержится в разделе ((docs/v4/errors об ошибках)). == Маршрутизация в контроллер == Laravel позволяет вам регистрировать маршруты не только в виде функции-замыкания, но и классов-((docs/v4/controllers контроллеров)) и даже создавать ((docs/v4/controllers#ресурс контроллеры ресурсов)). Больше информации содержится в разделе ((docs/v4/controllers о контроллерах)).