成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Lumen 初體驗(yàn)

Leck1e / 1355人閱讀

摘要:介紹為速度而生的框架。是官方給出的例子,直接拷貝命名為。一般來說,我們應(yīng)該避免使用末尾帶斜杠的。因?yàn)樗绻也坏轿募?,就會自?dòng)在末尾加個(gè)斜杠,嘗試尋找目錄下的文件等等,具體是在中配置。方案修改修改的配置文件,將指向重啟。

介紹

Lumen:“為速度而生的 Laravel 框架”。

Lumen 是 Laravel 的作者(Taylor Otwell)的又一力作。簡單、快速、優(yōu)雅的它的特點(diǎn),適合用于構(gòu)建微服務(wù)架構(gòu)和 API 應(yīng)用。
官網(wǎng):http://lumen.laravel.com
介紹:https://phphub.org/topics/701
中文文檔:http://lumen.laravel-china.org/docs

安裝

使用 composer 安裝:

bashcomposer create-project laravel/lumen --prefer-dist
配置

Lumen 默認(rèn)使用 .env 作為配置文件。.env.example 是官方給出的例子,直接拷貝命名為 .env。

bashcd lumen
cp .env.example .env
調(diào)試模式

修改 .env 文件:

bashAPP_DEBUG=true

如果發(fā)現(xiàn)還是沒有效果,再修改 lumen/bootstrap/app.php 文件,將 Dotenv::load 的注釋移除掉。

疑問 1.為什么提示:not be found

訪問:http://127.0.0.1/lumen/public/

顯示:

bashSorry, the page you are looking for could not be found.

NotFoundHttpException in Application.php line 1121:

in Application.php line 1121
at Application->handleDispatcherResponse(array("0")) in Application.php line 1091
at Application->dispatch(null) in Application.php line 1026
at Application->run() in index.php line 28

查看路由文件 lumen/app/Http/routes.php

php$app->get("/", function() use ($app) {
    return $app->welcome();
});

感覺沒有問題啊,和在 Laravel 中差不多的方式,那是哪里出了問題了?好的,先不管,嘗試自己新定義一條路由規(guī)則試試看:

php$app->get("/test", function() use ($app) {
    return $app->welcome();
});

再訪問:http://127.0.0.1/lumen/public/test

結(jié)果和剛才一樣。

2.為什么會跳轉(zhuǎn)

再嘗試訪問一下:http://127.0.0.1/lumen/public/test/
結(jié)果跳轉(zhuǎn)到:http://127.0.0.1/test

解惑

我先來解釋一下第 2 個(gè)問題,因?yàn)檫@是一個(gè)很多 Laravel 新手也經(jīng)常問的問題。

原因何在?請看 lumen/public/.htaccess 文件:

bashRewriteRule ^(.*)/$ /$1 [L,R=301]

這是一條 Apache 路由重寫規(guī)則(mod_rewrite 開啟的情況下才有效),當(dāng)請求的 URI 帶有 /,就會匹配出 $1, 永久重定向(HTTP 狀態(tài)碼是 301)到根目錄下的 $1。上面的例子中,匹配到 test(就是$1),就跳轉(zhuǎn)至 /test 了。

如何來規(guī)避上面這個(gè)問題?注釋這條 RewriteRule 嗎?不是的。一般來說,我們應(yīng)該避免使用末尾帶斜杠的 URI。為什么 URI 末尾不應(yīng)該帶有斜杠呢?從語義是來說, test/ 表示目錄,test 表示資源。還有,如果在 lumen/public 目錄下真的有一個(gè) test 目錄,那么訪問 http://127.0.0.1/lumen/public/test/,就會進(jìn)入到 test 目錄下面來,這不是我們想要的結(jié)果。(其實(shí)如果真的存在 test 目錄并且不存在文件 test,那么,URI 末尾有沒有斜杠都會進(jìn)入到 test 目錄中來,這是 Apache 決定的。因?yàn)樗绻也坏轿募?,就會自?dòng)在末尾加個(gè)斜杠,嘗試尋找目錄下的 index.html 文件等等,具體是在 httpd.conf 中配置 DirectoryIndex。好吧,扯得太遠(yuǎn)了,拽回來)
總之,我還是建議 URI 末尾不要帶 /,如果你非不聽,那就注釋上面那句 RewriteRule 吧,這樣就不會重定向了。

關(guān)于第 1 個(gè)問題,我們也來分析一下發(fā)生的原因,這樣才能對癥下藥。
根據(jù)錯(cuò)誤提示,定位到文件 lumen/vendor/laravel/lumen-framework/src/Application.php 中:

php    /**
     * Dispatch the incoming request.
     *
     * @param  SymfonyRequest|null  $request
     * @return Response
     */
    public function dispatch($request = null)
    {
        if ($request) {
            $this->instance("IlluminateHttpRequest", $request);
            $this->ranServiceBinders["registerRequestBindings"] = true;

            $method = $request->getMethod();
            $pathInfo = $request->getPathInfo();
        } else {
            $method = $this->getMethod();
            $pathInfo = $this->getPathInfo();
        }        

        try {
            if (isset($this->routes[$method.$pathInfo])) {
                return $this->handleFoundRoute([true, $this->routes[$method.$pathInfo]["action"], []]);
            }

            return $this->handleDispatcherResponse(
                $this->createDispatcher()->dispatch($method, $pathInfo)
            );
        } catch (Exception $e) {
            return $this->sendExceptionToHandler($e);
        }
    }

匹配不到 route 的原因就在以上代碼中。假設(shè)訪問:http://127.0.0.1/lumen/public,那么 :

phpvar_dump($method);  // string(3) "GET"
var_dump($pathInfo);  // string(14) "/lumen/public/"

根據(jù) lumen/app/Http/routes.php 中的定義,生成 $this->routes

phpvar_dump(array_keys($this->routes));  // array(2) { [0]=> string(4) "GET/" [1]=> string(8) "GET/test" }

由上可知, isset($this->routes[$method.$pathInfo]) 的結(jié)果就是 false,所以提示 not be found 了。
既然已經(jīng)知道了原因,那問題就好解決了。解決的前提是不要改動(dòng)框架的源代碼,不然日后升級框架會多么蛋疼,你都把框架代碼都修改,萬一出了問題你咋辦?你自己拆手機(jī),官方是不保修的哦!當(dāng)然,如果你是框架開發(fā)組的,你提交代碼能被大家接受并被官方合并到主干代碼中了,那你就改吧。

方案1:修改 DocumentRoot

修改 Apache 的配置文件 httpd.conf,將 DocumentRoot 指向 lumen/public

bashDocumentRoot "/sites/lumen/public"

重啟 Apache。

但是,如果我還有其他站點(diǎn)也在這個(gè) Apache 下面,改 DocumentRoot 就會導(dǎo)致其他的站點(diǎn)不能訪問了。怎么辦?請看方案 2。

方案2:配置 Apache 虛擬主機(jī)

修改 httpd.conf,將下面這行的注釋移除:

bashInclude etc/extra/httpd-vhosts.conf

修改 httpd-vhosts.conf

bash
    DocumentRoot "/sites"
    ServerName 127.0.0.1


    DocumentRoot "/sites/lumen/public"
    ServerName lumen.app

重啟 Apache。

修改主機(jī)的 etc/hosts,添加一行:

bash127.0.0.1 lumen.app

其中 127.0.0.1 應(yīng)該換成你 lumen 應(yīng)用存放的機(jī)器的 ip。

OK,這樣就可以通過訪問 http://lumen.app 來訪問該 lumen 站點(diǎn),通過 http://127.0.0.1 來訪問其他站點(diǎn)。

但是,你壓根不能修改 Apache 的配置,怎么辦?請看方案 3。

方案3.修改路由規(guī)則中的路徑

改不了配置,就改代碼嘍(再強(qiáng)調(diào)一下,不是修改框架的源代碼)。

修改路由文件 lumen/app/Http/routes.php

php
define("ROUTE_BASE", "lumen/public"); $app->get(ROUTE_BASE . "/index", function() use ($app) { return $app->welcome(); }); $app->get(ROUTE_BASE . "/test", function() use ($app) { return $app->welcome(); });

這樣,如果以后有變化的話,你只需要修改 define("ROUTE_BASE", "lumen/public/");就可以了(當(dāng)然,把這個(gè)寫到應(yīng)用配置項(xiàng)中是最合適的,部署時(shí)修改配置就可以了)。

至于想以 "lumen/public/" 作為首頁 URI 顯然是不可以的,建議使用 "lumen/pulbic/index" 作為首頁。如同上面代碼定義的路由規(guī)則那樣。

因?yàn)?,無論你在路由規(guī)則的字符串末尾加了多少個(gè)斜杠, $this->routes 的鍵是不會帶有斜杠的,最終還是不能匹配的。原因在框架源代碼中 lumen/vendor/laravel/lumen-framework/src/Application.php

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

        $uri = $uri === "/" ? $uri : "/".trim($uri, "/");

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

        if (isset($this->groupAttributes)) {
            if (isset($this->groupAttributes["prefix"])) {
                $uri = rtrim("/".trim($this->groupAttributes["prefix"], "/").$uri, "/");
            }

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

        $this->routes[$method.$uri] = ["method" => $method, "uri" => $uri, "action" => $action];
    }

對,就是它:$uri = $uri === "/" ? $uri : "/".trim($uri, "/");。
所有,URI 末尾還是不帶斜杠的好。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/30236.html

相關(guān)文章

  • Lumen 體驗(yàn)(二)

    摘要:的現(xiàn)狀目前是版本,是基于開發(fā)。入口文件啟動(dòng)文件和配置文件框架的入口文件是。在路由中指定控制器類必須寫全命名空間,不然會提示找不到類。目前支持四種數(shù)據(jù)庫系統(tǒng)以及。使用時(shí)發(fā)生錯(cuò)誤,因?yàn)樵谖募?,的默認(rèn)驅(qū)動(dòng)是。 最近使用 Lumen 做了 2 個(gè)業(yè)余項(xiàng)目,特此記錄和分享一下。 Lumen 的介紹 在使用一項(xiàng)新的技術(shù)時(shí),了解其應(yīng)用場景是首要的事情。 Lumen 的口號:為速度而生的 La...

    Cheriselalala 評論0 收藏0
  • Lumen---為速度而生的 Laravel 框架

    摘要:什么是官網(wǎng)是一個(gè)由組件搭建而成的微框架是當(dāng)前最快的框架之一在什么時(shí)候使用專為微服務(wù)或者設(shè)計(jì)舉個(gè)例子如果你的應(yīng)用里面有部分業(yè)務(wù)邏輯的請求頻率比較高就可以單獨(dú)把這部分業(yè)務(wù)邏輯拿出來使用來構(gòu)建一個(gè)小因?yàn)槭菍?yōu)化了框架的加載機(jī)制所以對資源的要求少很 什么是 Lumen?官網(wǎng) lumen 是一個(gè)由 Laravel 組件搭建而成的微框架,是當(dāng)前最快的 PHP 框架之一! 在什么時(shí)候使用 Lume...

    104828720 評論0 收藏0
  • 學(xué)習(xí) Lumen 用戶認(rèn)證 (一)

    摘要:在開發(fā)中,用戶認(rèn)證是核心,是數(shù)據(jù)是否有保障的前提,目前主要有兩種常用方式進(jìn)行用戶認(rèn)證和。附是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于的開放標(biāo)準(zhǔn)。 好久沒寫 PHP 代碼了,尤其是 Lumen,我是 Lumen 的忠實(shí)用戶,自從面世開始,我就將 Lumen 作為我 API 的主要框架使用。 但說到 API,不得不說的一個(gè)概念:「前后端分離」,現(xiàn)在越來越多的團(tuán)隊(duì)都采用前后端分離,徹底解...

    wangzy2019 評論0 收藏0
  • 如何在Lumen中使用Elasticsearch

    摘要:之前受到這篇為你的站點(diǎn)插上的翅膀的啟發(fā)就嘗試在中引入,并完成中文索引。關(guān)于中文索引谷歌上關(guān)于中文搜索的文章有很多,例如這篇。中文索引中涉及的內(nèi)容比較多,下次再用一個(gè)篇幅來分析。 如何在Lumen中使用Elasticsearch 前言 Lumen是基于Laravel核心組件的微框架,隨著Laravel5的發(fā)布,目前版本也已經(jīng)到5了。之前受到這篇為你的站點(diǎn)插上ElasticSearch...

    jubincn 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<