Unetway

Laravel - Routing

Базовая маршрутизация

Самые основные маршруты Laravel принимают URI и a Closure, обеспечивая очень простой и выразительный метод определения маршрутов:

Route::get('foo', function () {
    return 'Hello World';
});

Файлы маршрутов по умолчанию

Все маршруты Laravel определены в ваших файлах маршрутов, которые находятся в routesкаталоге. Эти файлы автоматически загружаются фреймворком. Файл определяет маршруты, которые для вашего веб - интерфейса. Этим маршрутам назначается группа промежуточного программного обеспечения, которая обеспечивает такие функции, как состояние сеанса и защита CSRF. Маршруты в нем не имеют состояния и назначаются группе промежуточного программного обеспечения.routes/web.phpwebroutes/api.phpapi

Для большинства приложений вы начнете с определения маршрутов в вашем файле. Доступ к маршрутам, указанным в, можно получить, введя URL-адрес определенного маршрута в браузере. Например, вы можете получить доступ к следующему маршруту, перейдя в браузере:routes/web.phproutes/web.phphttp://your-app.test/user

Route::get('/user', 'UserController@index');

Маршруты, определенные в файле, вложены в группу маршрутов с помощью . В этой группе префикс URI применяется автоматически, поэтому вам не нужно вручную применять его к каждому маршруту в файле. Вы можете изменить префикс и другие параметры группы маршрутов, изменив свой класс.routes/api.phpRouteServiceProvider/apiRouteServiceProvider

Доступные методы маршрутизатора

Маршрутизатор позволяет регистрировать маршруты, которые отвечают на любой HTTP-глагол:

Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);

Иногда вам может понадобиться зарегистрировать маршрут, который отвечает на несколько HTTP-глаголов. Вы можете сделать это, используя matchметод. Или вы можете даже зарегистрировать маршрут, который отвечает на все HTTP-глаголы, используя anyметод:

Route::match(['get', 'post'], '/', function () {
    //
});

Route::any('/', function () {
    //
});

CSRF Защита

Любые формы HTML , указывающие POSTPUTили DELETEмаршруты, которые определены в webфайле маршруты должны включать маркер поле CSRF. В противном случае запрос будет отклонен. Вы можете прочитать больше о защите CSRF в документации CSRF :

<form method="POST" action="/profile">
    @csrf
    ...
</form>

 

Перенаправить маршруты

Если вы определяете маршрут, который перенаправляет на другой URI, вы можете использовать метод. Этот метод предоставляет удобный ярлык, так что вам не нужно определять полный маршрут или контроллер для выполнения простого перенаправления:Route::redirect

Route::redirect('/here', '/there');

По умолчанию возвращает код состояния. Вы можете настроить код состояния, используя необязательный третий параметр:Route::redirect302

Route::redirect('/here', '/there', 301);

Вы можете использовать метод для возврата кода состояния:Route::permanentRedirect301

Route::permanentRedirect('/here', '/there');

 

Посмотреть маршруты

Если вашему маршруту нужно только вернуть вид, вы можете использовать этот метод. Как и метод, этот метод предоставляет простой ярлык, так что вам не нужно определять полный маршрут или контроллер. Метод принимает URI в качестве первого аргумента и имени представления в качестве второго аргумента. Кроме того, вы можете предоставить массив данных для передачи в представление в качестве необязательного третьего аргумента:Route::viewredirectview

Route::view('/welcome', 'welcome');

Route::view('/welcome', 'welcome', ['name' => 'Taylor']);

 

Параметры маршрута

Обязательные параметры

Иногда вам нужно будет захватить сегменты URI в вашем маршруте. Например, вам может потребоваться захватить идентификатор пользователя из URL. Вы можете сделать это, определив параметры маршрута:

Route::get('user/{id}', function ($id) {
    return 'User '.$id;
});

Вы можете определить столько параметров маршрута, сколько требуется для вашего маршрута:

Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
    //
});

Параметры маршрута всегда заключаются в фигурные скобки и должны состоять из буквенных символов и могут не содержать символов. Вместо использования символа используйте подчеркивание ( ). Параметры маршрута вводятся в обратные вызовы / контроллеры маршрутов в зависимости от их порядка - имена аргументов обратного вызова / контроллера не имеют значения.{}--_

 

Необязательные параметры

Иногда вам может потребоваться указать параметр маршрута, но сделать присутствие этого параметра маршрута необязательным. Вы можете сделать это, поставив ?отметку после имени параметра. Убедитесь, что для соответствующей переменной маршрута задано значение по умолчанию:

Route::get('user/{name?}', function ($name = null) {
    return $name;
});

Route::get('user/{name?}', function ($name = 'John') {
    return $name;
});

 

Ограничения регулярных выражений

Вы можете ограничить формат параметров вашего маршрута, используя whereметод для экземпляра маршрута. whereМетод принимает имя параметра и регулярного выражения , определяющего , как должен ограничиваться параметр:

Route::get('user/{name}', function ($name) {
    //
})->where('name', '[A-Za-z]+');

Route::get('user/{id}', function ($id) {
    //
})->where('id', '[0-9]+');

Route::get('user/{id}/{name}', function ($id, $name) {
    //
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);

 

Глобальные ограничения

Если вы хотите, чтобы параметр маршрута всегда был ограничен данным регулярным выражением, вы можете использовать patternметод. Вы должны определить эти шаблоны в bootметоде вашего RouteServiceProvider:

/**
 * Define your route model bindings, pattern filters, etc.
 *
 * @return void
 */
public function boot()
{
    Route::pattern('id', '[0-9]+');

    parent::boot();
}

Как только шаблон был определен, он автоматически применяется ко всем маршрутам с использованием этого имени параметра:

Route::get('user/{id}', function ($id) {
    // Only executed if {id} is numeric...
});

 

Закодированные косые черты

Компонент маршрутизации Laravel допускает все символы, кроме /. Вы должны явно разрешить /быть частью вашего заполнителя, используя whereрегулярное выражение условия:

Route::get('search/{search}', function ($search) {
    return $search;
})->where('search', '.*');

Закодированные косые черты поддерживаются только в последнем сегменте маршрута.

 

Названные маршруты

Именованные маршруты позволяют удобно создавать URL-адреса или перенаправления для определенных маршрутов. Вы можете указать имя для маршрута, связав nameметод с определением маршрута:

Route::get('user/profile', function () {
    //
})->name('profile');

Вы также можете указать имена маршрутов для действий контроллера:

Route::get('user/profile', 'UserProfileController@show')->name('profile');

Создание URL-адресов для именованных маршрутов

После того как вы присвоили имя данному маршруту, вы можете использовать имя маршрута при создании URL-адресов или перенаправлений с помощью глобальной routeфункции:

// Generating URLs...
$url = route('profile');

// Generating Redirects...
return redirect()->route('profile');

Если указанный маршрут определяет параметры, вы можете передать параметры в качестве второго аргумента routeфункции. Указанные параметры будут автоматически вставлены в URL в правильных позициях:

Route::get('user/{id}/profile', function ($id) {
    //
})->name('profile');

$url = route('profile', ['id' => 1]);

Проверка текущего маршрута

Если вы хотите определить, был ли текущий запрос направлен на заданный именованный маршрут, вы можете использовать namedметод в экземпляре Route. Например, вы можете проверить текущее имя маршрута из промежуточного программного обеспечения маршрута:

/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @return mixed
 */
public function handle($request, Closure $next)
{
    if ($request->route()->named('profile')) {
        //
    }

    return $next($request);
}

 

Группы маршрутов

Группы маршрутов позволяют вам совместно использовать атрибуты маршрута, такие как промежуточное программное обеспечение или пространства имен, по большому количеству маршрутов без необходимости определять эти атрибуты на каждом отдельном маршруте. Общие атрибуты указываются в формате массива в качестве первого параметра метода.Route::group

Вложенные группы пытаются интеллектуально «объединить» атрибуты со своей родительской группой. Промежуточное программное обеспечение и whereусловия объединяются, а имена, пространства имен и префиксы добавляются. Разделители пространства имен и косые черты в префиксах URI добавляются автоматически при необходимости.

 

Промежуточное

Чтобы назначить промежуточное программное обеспечение для всех маршрутов в группе, вы можете использовать middlewareметод до определения группы. Промежуточное программное обеспечение выполняется в том порядке, в котором они перечислены в массиве:

Route::middleware(['first', 'second'])->group(function () {
    Route::get('/', function () {
        // Uses first & second Middleware
    });

    Route::get('user/profile', function () {
        // Uses first & second Middleware
    });
});

 

Пространства имен

Другим распространенным вариантом использования групп маршрутов является назначение одного и того же пространства имен PHP группе контроллеров с помощью namespaceметода:

Route::namespace('Admin')->group(function () {
    // Controllers Within The "App\Http\Controllers\Admin" Namespace
});

Помните, что по умолчанию RouteServiceProviderфайлы маршрутов включены в группу пространств имен, что позволяет регистрировать маршруты контроллера без указания полного префикса пространства имен. Таким образом, вам нужно только указать часть пространства имен, которая идет после базового пространства имен.App\Http\ControllersApp\Http\Controllers

 

Субдоменная маршрутизация

Группы маршрутов также могут использоваться для обработки маршрутизации в субдомене. Субдоменам могут быть назначены параметры маршрута точно так же, как и URI маршрута, что позволяет вам захватывать часть субдомена для использования в вашем маршруте или контроллере. Субдомен может быть указан путем вызова domainметода перед определением группы:

Route::domain('{account}.myapp.com')->group(function () {
    Route::get('user/{id}', function ($account, $id) {
        //
    });
});

Чтобы обеспечить доступность маршрутов вашего субдомена, вам необходимо зарегистрировать маршруты субдомена перед регистрацией маршрутов корневого домена. Это не позволит маршрутам корневого домена перезаписывать маршруты поддоменов, которые имеют одинаковый путь URI.

 

Префиксы маршрутов

Этот prefixметод может использоваться для префикса каждого маршрута в группе с заданным URI. Например, вы можете захотеть поставить перед всеми URI маршрута в группе префикс admin:

Route::prefix('admin')->group(function () {
    Route::get('users', function () {
        // Matches The "/admin/users" URL
    });
});

 

Префиксы имени маршрута

Этот nameметод может использоваться для добавления к каждому имени маршрута в группе заданной строки. Например, вы можете захотеть поставить перед всеми именами сгруппированных маршрутов префикс admin. Данная строка имеет префикс к имени маршрута в точности так, как он указан, поэтому мы будем обязательно указывать завершающий .символ в префиксе:

Route::name('admin.')->group(function () {
    Route::get('users', function () {
        // Route assigned name "admin.users"...
    })->name('users');
});

 

Привязка модели маршрута

При внедрении идентификатора модели в маршрут или действие контроллера вы часто будете запрашивать модель, соответствующую этому идентификатору. Привязка модели маршрута Laravel обеспечивает удобный способ автоматической вставки экземпляров модели непосредственно в ваши маршруты. Например, вместо введения идентификатора пользователя вы можете внедрить весь Userэкземпляр модели, который соответствует данному идентификатору.

 

Неявное связывание

Laravel автоматически разрешает модели Eloquent, определенные в маршрутах или действиях контроллера, чьи имена переменных с подсказками типов соответствуют имени сегмента маршрута. Например:

Route::get('api/users/{user}', function (App\User $user) {
    return $user->email;
});

Поскольку $userпеременная подсказана по типу в качестве модели Eloquent, а имя переменной соответствует сегменту URI, Laravel автоматически внедрит экземпляр модели, идентификатор которой соответствует соответствующему значению, из URI запроса. Если соответствующий экземпляр модели не найден в базе данных, автоматически генерируется HTTP-ответ 404.App\User{user}

Настройка имени ключа

Если вы хотите, чтобы привязка модели использовала столбец базы данных, отличный от idизвлечения данного класса модели, вы можете переопределить getRouteKeyNameметод в модели Eloquent:

/**
 * Get the route key for the model.
 *
 * @return string
 */
public function getRouteKeyName()
{
    return 'slug';
}

 

Явная привязка

Чтобы зарегистрировать явную привязку, используйте метод маршрутизатора, modelчтобы указать класс для данного параметра. Вы должны определить свои явные привязки модели в bootметоде RouteServiceProviderкласса:

public function boot()
{
    parent::boot();

    Route::model('user', App\User::class);
}

Затем определите маршрут, который содержит параметр:{user}

Route::get('profile/{user}', function (App\User $user) {
    //
});

Поскольку мы привязали все параметры к модели, экземпляр будет добавлен в маршрут. Так, например, запрос будет впрыскивать экземпляр из базы данных , которая имеет идентификатор .{user}App\UserUserprofile/1User1

Если соответствующий экземпляр модели не найден в базе данных, автоматически генерируется HTTP-ответ 404.

Настройка логики разрешения

Если вы хотите использовать свою собственную логику разрешения, вы можете использовать метод. Вы передаете метод получит значение сегмента URI и должен возвращать экземпляр класса , который должен быть введен в маршрут:Route::bindClosurebind

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    parent::boot();

    Route::bind('user', function ($value) {
        return App\User::where('name', $value)->first() ?? abort(404);
    });
}

Кроме того, вы можете переопределить resolveRouteBindingметод в вашей модели Eloquent. Этот метод получит значение сегмента URI и должен вернуть экземпляр класса, который должен быть введен в маршрут:

/**
 * Retrieve the model for a bound value.
 *
 * @param  mixed  $value
 * @return \Illuminate\Database\Eloquent\Model|null
 */
public function resolveRouteBinding($value)
{
    return $this->where('name', $value)->first() ?? abort(404);
}

 

Запасные маршруты

Используя метод, вы можете определить маршрут, который будет выполняться, когда никакой другой маршрут не соответствует входящему запросу. Как правило, необработанные запросы автоматически отображают страницу «404» через обработчик исключений вашего приложения. Однако, поскольку вы можете определить маршрут в своем файле, все промежуточное программное обеспечение в группе промежуточного программного обеспечения будет применяться к маршруту. Вы можете добавить дополнительное промежуточное программное обеспечение для этого маршрута по мере необходимости:Route::fallbackfallbackroutes/web.phpweb

Route::fallback(function () {
    //
});

Резервный маршрут всегда должен быть последним, зарегистрированным вашим приложением.

 

Ограничение скорости

Laravel включает промежуточное программное обеспечение для ограничения доступа к маршрутам в вашем приложении. Для начала назначьте throttleпромежуточное ПО для маршрута или группы маршрутов. throttleПромежуточный слой принимает два параметра , которые определяют максимальное количество запросов , которые могут быть сделаны в заданном числе минут. Например, давайте уточним, что аутентифицированный пользователь может обращаться к следующей группе маршрутов 60 раз в минуту:

Route::middleware('auth:api', 'throttle:60,1')->group(function () {
    Route::get('/user', function () {
        //
    });
});

Динамическое ограничение скорости

Вы можете указать максимум динамического запроса на основе атрибута аутентифицированной Userмодели. Например, если ваша Userмодель содержит rate_limitатрибут, вы можете передать имя атрибута throttleпромежуточному программному обеспечению, чтобы оно использовалось для расчета максимального количества запросов:

Route::middleware('auth:api', 'throttle:rate_limit,1')->group(function () {
    Route::get('/user', function () {
        //
    });
});

 

Форма Спуфинг

HTML форма не поддерживает PUTPATCHили DELETEдействий. Таким образом, при определении PUTPATCHили DELETEмаршрутов, которые вызываются из HTML - формы, вам нужно будет добавить скрытое _methodполе в форме. Значение, отправленное с _methodполем, будет использоваться в качестве метода HTTP-запроса:

<form action="/foo/bar" method="POST">
    <input type="hidden" name="_method" value="PUT">
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>

Вы можете использовать @methodдирективу Blade для генерации _methodввода:

<form action="/foo/bar" method="POST">
    @method('PUT')
    @csrf
</form>

 

Доступ к текущему маршруту

Вы можете использовать currentcurrentRouteNameи currentRouteActionметоды на Routeфасаде , чтобы получить доступ к информации об обработке входящего запроса маршрута:

$route = Route::current();

$name = Route::currentRouteName();

$action = Route::currentRouteAction();

Обратитесь к документации по API для обоих базового класса фасада маршрута и объекта маршрута , чтобы просмотреть все доступные методы.