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

そら
  • 55
回复
阅读 4k
5 个回答
gclove
  • 1.4k
✓ 已被采纳

原理很简单

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 实例; 是不是发现了

    public function get($uri, $action = null)
    {
        return $this->addRoute(['GET', 'HEAD'], $uri, $action);
    }

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


问答时间

我们可以确认了 'router' 是在
Illuminate/Routing/RoutingServiceProvider.php 里面的

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

答案在这里

Illuminate/Foundation/Application.php

注意 base service providersconfigured providers


这个答案排版放不下了, 放到了文章里面

问答的其它问题

并非是直接使用
AppProvidersRouteServiceProvider.php 中有定义好加载Route类

use IlluminateSupportFacadesRoute;

这个文件和其它文件比起来没有namespace关键字,自然使用类不需要use之类的操作,配合Laravel的门面模式(Facades)可以通过静态方式访问实例。所有的Facades类你可以在config/app.php下看到,里面有个"aliases"的键,它的值就是所有的Facades。

appProvidersRouteServiceProvider.php 中 map 方法

可以看出, 他是在其他的地方进行了 require

web.php 或者 api.php 并不是一个能单独运行的php文件, 它之所以能直接使用 Route 也是因为他是被 require 的文件

laravel 门面模式

宣传栏