Laravel中你为什么可以直接在 web.php 中 直接使用 Route ? 服务提供者的介绍

gclove

这篇文章来自一个 sf 社区问题的思考

laravel web.php 中 Route 为什么可以直接使用


原理很简单

1 . 首先, 你注意一下 /config/app.php 里面

/*
    |--------------------------------------------------------------------------
    | Class Aliases
    |--------------------------------------------------------------------------
    |
    | This array of class aliases will be registered when this application
    | is started. However, feel free to register as many as you wish as
    | the aliases are "lazy" loaded so they don't hinder performance.
    |
    */
    'aliases' => [
        'Route' => Illuminate\Support\Facades\Route::class,
    ];

2 . 因为有 Facades, 所以我们直接去看 Illuminate\Support\Facades\Route::class 这个类返回的内容

* @method static \Illuminate\Routing\Route get(string $uri, \Closure|array|string $action)

/**
 * Get the registered name of the component.
 *
 * @return string
 */
protected static function getFacadeAccessor()
{
    return 'router';
}

3 . 那就简单了, 直接去找注册为 router 的组件

发现是在 Illuminate/Routing/RoutingServiceProvider.php

/**
 * Register the router instance.
 *
 * @return void
 */
protected function registerRouter()
{
    $this->app->singleton('router', function ($app) {
        return new Router($app['events'], $app);
    });
}

4 . new Router() 看到了没, 很显然就会返回 Illuminate/Routing/Router.php 实例; 是不是发现了

   /**
     * Register a new GET route with the router.
     *
     * @param  string  $uri
     * @param  \Closure|array|string|null  $action
     * @return \Illuminate\Routing\Route
     */
    public function get($uri, $action = null)
    {
        return $this->addRoute(['GET', 'HEAD'], $uri, $action);
    }

(づ ̄3 ̄)づ╭❤~ 宣我 !! 么么


问答时间

1) . 我确认了 'router' 是在
Illuminate/Routing/RoutingServiceProvider.php 里面的 ,

但是为什么没有配置在 /config/app.phpproviders 里面呢

答案在这里

Illuminate/Foundation/Application.php

注意 base service providersconfigured providers



    /**
     * Register all of the base service providers.
     *
     * @return void
     */
    protected function registerBaseServiceProviders()
    {
        $this->register(new EventServiceProvider($this));

        $this->register(new LogServiceProvider($this));

        $this->register(new RoutingServiceProvider($this));
    }
    
    

   /**
     * Register all of the configured providers.
     *
     * @return void
     */
    public function registerConfiguredProviders()
    {
        (new ProviderRepository($this, new Filesystem, $this->getCachedServicesPath()))
                    ->load($this->config['app.providers']);
    }

2) . 那我看到在 /config/app.php 注册了一个看起来像路由相关的 App\Providers\RouteServiceProvider::class, 它是干嘛用的呢?

答案在这里

首先 App\Providers\RouteServiceProvider 继承自 Illuminate\Foundation\Support\Providers\RouteServiceProvider; (并且调用了我们上面的 Illuminate\Support\Facades\Route, 可以使用 Route::* )

直接看看 Illuminate\Foundation\Support\Providers\RouteServiceProvider 你就会明白


    public function boot()
    {
        $this->setRootControllerNamespace();

        if ($this->app->routesAreCached()) {
            $this->loadCachedRoutes();
        } else {
            $this->loadRoutes();

            $this->app->booted(function () {
                $this->app['router']->getRoutes()->refreshNameLookups();
                $this->app['router']->getRoutes()->refreshActionLookups();
            });
        }
    }
    
    public function register()
    {
        // 没有在这里注册
    }

providers文档

boot 方法是在所有服务提供者都注册完成后调用的方法, 所以说 这是启动后 注册路由的 provider

阅读 3.4k

gclove
PHP 开发者一枚 ~ 爱好摄影!梦想是摄得跟AV摄影师一样好 .

PHP 开发者一枚 ~ 爱好摄影!梦想是摄得跟AV摄影师一样好 .

1.4k 声望
12 粉丝
0 条评论

PHP 开发者一枚 ~ 爱好摄影!梦想是摄得跟AV摄影师一样好 .

1.4k 声望
12 粉丝
文章目录
宣传栏