1

继续学习lumen5.5

-----------------------分割线-----------------------

看看是怎么输出'Lumen (5.5.2) (Laravel Components 5.5.*)'这个数据

public目录下的index.php加载了bootstrap下的app.php

require_once __DIR__.'/../vendor/autoload.php';//composer的自动加载
(new Dotenv\Dotenv(__DIR__.'/../'))->load(); //加载.env的配置

$app = new Laravel\Lumen\Application(
    realpath(__DIR__.'/../')
);//初始化应用

//初始化的内容
public function __construct($basePath = null)
{
    if (! empty(env('APP_TIMEZONE'))) {
        date_default_timezone_set(env('APP_TIMEZONE', 'UTC'));
    }
    //指定项目基础目录
    $this->basePath = $basePath;
    //注册服务容器
    $this->bootstrapContainer();
    //注册异常处理
    $this->registerErrorHandling();
    //实例化Route路由类
    $this->bootstrapRouter();
}

然后是注册核心组件进服务容器中(laravel的服务容器后面再学习)

主要看

$app->router->group([
    'namespace' => 'App\Http\Controllers',
], function ($router) {
    require __DIR__.'/../routes/web.php';
});

加载路由文件以便它们可以全部被添加到应用,这将提供所有请求接口的响应
第一个参数是指定处理接口属性设置,namespance属性是指定处理请求的控制器所在目录
第二个参数是一个闭包函数,传一个匿名函数到group方法里

找到web.php

$router->get('/', function () use ($router) {
    return $router->app->version();
});

把web.php定义的路由都放在这个这个匿名函数中,相当于下面这样

$app->router->group([
    'namespace' => 'App\Http\Controllers',
], function ($router) {
    $router->get('/', function () use ($router) {
        return $router->app->version();
    });
});

然后看Router类里面的group方法,有一个

call_user_func($callback, $this);

这段代码执行传进来的匿名函数,就是web.php定义的所有路由

$router->get('/', function () use ($router) {
    return $router->app->version();
});

找到Router类里面的get方法看到调用了addRoute方法,看到名字就大概知道是添加路由的意思

    /**
     * Add a route to the collection.
     *
     * @param  array|string  $method
     * @param  string  $uri
     * @param  mixed  $action
     * @return void
     */
    public function addRoute($method, $uri, $action)
    {
        $action = $this->parseAction($action);

        $attributes = null;

        if ($this->hasGroupStack()) {
            $attributes = $this->mergeWithLastGroup([]);
        }

        if (isset($attributes) && is_array($attributes)) {
            if (isset($attributes['prefix'])) {
                $uri = trim($attributes['prefix'], '/').'/'.trim($uri, '/');
            }

            if (isset($attributes['suffix'])) {
                $uri = trim($uri, '/').rtrim($attributes['suffix'], '/');
            }

            $action = $this->mergeGroupAttributes($action, $attributes);
        }

        $uri = '/'.trim($uri, '/');

        if (isset($action['as'])) {
            $this->namedRoutes[$action['as']] = $uri;
        }

        if (is_array($method)) {
            foreach ($method as $verb) {
                $this->routes[$verb.$uri] = ['method' => $verb, 'uri' => $uri, 'action' => $action];
            }
        } else {
            $this->routes[$method.$uri] = ['method' => $method, 'uri' => $uri, 'action' => $action];
        }
    }

里面做的就是把在web.php定义的路由翻译成你想要处理的方式,最后都放在$routes这个属性当中,这里可以参考文档中[HTTP 路由][1]部分(这是旧版中文文档,新版要看官网的英文版,不同之处在于$app换成$route,旧的路由定义文件是routes.php,新的是web.php)

可以把上面那个请求路由的代码翻译成,当请求路由为'api.com/index.php/'时候,调用匿名函数

function () use ($router) {
    return $router->app->version();
}

进行响应;可以看出当执行匿名函数时调用的是application类里面的version方法

public function version()
{
    return 'Lumen (5.5.2jjj) (Laravel Components 5.5.*)';
}

PS:这里只是return,还不是echo输出,继续往下看,$app->run();下次再补充....


hano
192 声望16 粉丝

WEB后端开发, PHP&GO