lumen5.5學習(二)

hano發表於2019-02-16

繼續學習lumen5.5

———————–分割線———————–

看看是怎麼輸出`Lumen (5.5.2) (Laravel Components 5.5.*)`這個資料

public目錄下的index.php載入了bootstrap下的app.php

require_once __DIR__.`/../vendor/autoload.php`;//composer的自動載入
(new DotenvDotenv(__DIR__.`/../`))->load(); //載入.env的配置

$app = new LaravelLumenApplication(
    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` => `AppHttpControllers`,
], 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` => `AppHttpControllers`,
], 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();下次再補充….

相關文章