lumen5.5學習(二)

繼續學習lumen5.5php

-----------------------分割線-----------------------laravel

看看是怎麼輸出'Lumen (5.5.2) (Laravel Components 5.5.*)'這個數據web

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

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

$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

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

加載路由文件以便它們能夠所有被添加到應用,這將提供全部請求接口的響應
第一個參數是指定處理接口屬性設置,namespance屬性是指定處理請求的控制器所在目錄
第二個參數是一個閉包函數,傳一個匿名函數到group方法裏composer

找到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();下次再補充....

相關文章
相關標籤/搜索