摘要:介紹為速度而生的框架。是官方給出的例子,直接拷貝命名為。一般來說,我們應(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ā)組的,你提交代碼能被大家接受并被官方合并到主干代碼中了,那你就改吧。
修改 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:
bashDocumentRoot "/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
摘要:的現(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...
摘要:什么是官網(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...
摘要:在開發(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ì)都采用前后端分離,徹底解...
摘要:之前受到這篇為你的站點(diǎn)插上的翅膀的啟發(fā)就嘗試在中引入,并完成中文索引。關(guān)于中文索引谷歌上關(guān)于中文搜索的文章有很多,例如這篇。中文索引中涉及的內(nèi)容比較多,下次再用一個(gè)篇幅來分析。 如何在Lumen中使用Elasticsearch 前言 Lumen是基于Laravel核心組件的微框架,隨著Laravel5的發(fā)布,目前版本也已經(jīng)到5了。之前受到這篇為你的站點(diǎn)插上ElasticSearch...
閱讀 1550·2023-04-26 02:08
閱讀 3139·2021-10-14 09:42
閱讀 7229·2021-09-22 15:34
閱讀 3250·2019-08-30 13:16
閱讀 2751·2019-08-26 13:49
閱讀 1355·2019-08-26 11:59
閱讀 1286·2019-08-26 10:31
閱讀 2178·2019-08-23 17:19