Маршрутизация 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)
Вот полный поток:
- Фасад Маршрута сначала переадресует вызов
Illuminate\Routing\Router
черезFacade::__callStatic
, - поскольку
Router::prefix
это неpublic
метод ноprotected
метод, этот вызов направляетсяRouteRegistrar::attribute
сквозьRouter::__call
метод. - Наконец то
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 |
---------------------------------------------------------------
Поток
- (Защищенный)
prefix
метод обрабатывается__call@Router
,return (new RouteRegistrar($this))->attribute($method, $parameters[0]);
выполняется attribute@RouteRegistrar
метод вызывается и элемент'prefix' => 'home'
добавляется в$this->attributes
массив- Так как
attribute@RouteRegistrar
метод возвращает$this
,group@RouteRegistrar
метод называется group@RouteRegistrar
метод вызываетgroup@Router
методloadRoutes@Router
метод называется. Он проанализирует все маршруты, присутствующие в закрытии, т.е.Route::get('/test', ...)
;- На этот раз
get
метод вызывается в классе, лежащем в основеRoute
фасад,Router
учебный класс.get@Router
метод выполнен addRoute@Router
называется, который в свою очередь вызываетcreateRoute@Router
метод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