Маршрутизация Laravel: Где определен метод prefix()?

В моем примере я определил маршрут:

Route::prefix('home')->group(function(){
    Route::get('/test',....);
});

Когда я получаю доступ mydomain/home/test, оно работает. Тем не менее, я не знаю, где prefix метод находится. Я думаю, что это может быть в Illuminate\Routing\Route.php. Но когда я удаляю prefix метод на это, это все еще работает?

3 ответа

Решение

@louisfischer ответ неверный. Router::prefix не называется вообще.

prefix метод вызывается из RouteRegistrar который, наконец, направляется RouteRegistrar::attribute метод.

Вы можете убедиться в этом, посмотрев в Illuminate\Support\Facades\Route DocBlock.

* @method static \Illuminate\Routing\RouteRegistrar prefix(string  $prefix)

Вот полный поток:

  1. Фасад Маршрута сначала переадресует вызов Illuminate\Routing\Router через Facade::__callStatic,
  2. поскольку Router::prefix это не public метод но protected метод, этот вызов направляется RouteRegistrar::attribute сквозь Router::__call метод.
  3. Наконец то prefix($url) метод преобразуется в RouteRegistrar::attribute('prefix', $url)

prefix Метод находится в Illuminate\Routing\Router учебный класс.

Абсолютный путь в типичном приложении Laravel 5 будет:

vendor/laravel/framework/src/Illuminate/Routing/Router.php

Как это найти?

Вы, наверное, знаете, что когда вы пишете Route:: вы на самом деле используете фасад Laravel под названием Route, Оттуда вы можете найти ссылку на класс фасадов в официальной документации Laravel 5.4 по адресу https://laravel.com/docs/5.4/facades. Вот строка, которую вы ищете:

---------------------------------------------------------------
|Facade |Class                     |Service Container Binding |
---------------------------------------------------------------
|Route  |Illuminate\Routing\Router |router                    |
---------------------------------------------------------------

Поток

  1. (Защищенный) prefix метод обрабатывается __call@Router, return (new RouteRegistrar($this))->attribute($method, $parameters[0]); выполняется
  2. attribute@RouteRegistrar метод вызывается и элемент 'prefix' => 'home' добавляется в $this->attributes массив
  3. Так как attribute@RouteRegistrar метод возвращает $this, group@RouteRegistrar метод называется
  4. group@RouteRegistrar метод вызывает group@Router метод
  5. loadRoutes@Router метод называется. Он проанализирует все маршруты, присутствующие в закрытии, т.е. Route::get('/test', ...);
  6. На этот раз get метод вызывается в классе, лежащем в основе Route фасад, Router учебный класс. get@Router метод выполнен
  7. addRoute@Router называется, который в свою очередь вызывает createRoute@Router метод
  8. createRoute@Router звонки newRoute@Router с префиксом URI в качестве второго аргумента

Вы заметите, что prefix@Router вызовы методов getLastGroupPrefix@Router которые, очевидно, получают префикс последней группы.

prefix Метод может быть использован для префикса каждого маршрута в группе с заданным URI.

Вы можете использовать этот код:

Route::group(['prefix' => 'home'], function () {
   Route::get('test', 'yourController@yourFunctions');
}

или это

Route::prefix('home')->group(function () {
    Route::get('test', 'yourController@yourFunctions');
});

Это не имеет значения, потому что дает одинаковые результаты.

Дополнительная информация: https://laravel.com/docs/5.4/routing

Другие вопросы по тегам