Маршрутизация Laravel: Где определен метод prefix ()? - PullRequest
0 голосов
/ 04 декабря 2018

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

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

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

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

Метод 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-reference. Вот строка, которую вы ищете:

---------------------------------------------------------------
|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, который, очевидно, возвращает префикс последней группы.

0 голосов
/ 06 декабря 2018

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

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

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

* @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)
0 голосов
/ 04 декабря 2018

Метод 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#route-group-prefixes

...