摘要:介紹為速度而生的框架。是官方給出的例子,直接拷貝命名為。一般來說,我們應該避免使用末尾帶斜杠的。因為它如果找不到文件,就會自動在末尾加個斜杠,嘗試尋找目錄下的文件等等,具體是在中配置。方案修改修改的配置文件,將指向重啟。
介紹
Lumen:“為速度而生的 Laravel 框架”。
Lumen 是 Laravel 的作者(Taylor Otwell)的又一力作。簡單、快速、優雅的它的特點,適合用于構建微服務架構和 API 應用。
官網:http://lumen.laravel.com
介紹:https://phphub.org/topics/701
中文文檔:http://lumen.laravel-china.org/docs
使用 composer 安裝:
bashcomposer create-project laravel/lumen --prefer-dist配置
Lumen 默認使用 .env 作為配置文件。.env.example 是官方給出的例子,直接拷貝命名為 .env。
bashcd lumen cp .env.example .env調試模式
修改 .env 文件:
bashAPP_DEBUG=true
如果發現還是沒有效果,再修改 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 中差不多的方式,那是哪里出了問題了?好的,先不管,嘗試自己新定義一條路由規則試試看:
php$app->get("/test", function() use ($app) { return $app->welcome(); });
再訪問:http://127.0.0.1/lumen/public/test
結果和剛才一樣。
2.為什么會跳轉再嘗試訪問一下:http://127.0.0.1/lumen/public/test/
結果跳轉到:http://127.0.0.1/test
我先來解釋一下第 2 個問題,因為這是一個很多 Laravel 新手也經常問的問題。
原因何在?請看 lumen/public/.htaccess 文件:
bashRewriteRule ^(.*)/$ /$1 [L,R=301]
這是一條 Apache 路由重寫規則(mod_rewrite 開啟的情況下才有效),當請求的 URI 帶有 /,就會匹配出 $1, 永久重定向(HTTP 狀態碼是 301)到根目錄下的 $1。上面的例子中,匹配到 test(就是$1),就跳轉至 /test 了。
如何來規避上面這個問題?注釋這條 RewriteRule 嗎?不是的。一般來說,我們應該避免使用末尾帶斜杠的 URI。為什么 URI 末尾不應該帶有斜杠呢?從語義是來說, test/ 表示目錄,test 表示資源。還有,如果在 lumen/public 目錄下真的有一個 test 目錄,那么訪問 http://127.0.0.1/lumen/public/test/,就會進入到 test 目錄下面來,這不是我們想要的結果。(其實如果真的存在 test 目錄并且不存在文件 test,那么,URI 末尾有沒有斜杠都會進入到 test 目錄中來,這是 Apache 決定的。因為它如果找不到文件,就會自動在末尾加個斜杠,嘗試尋找目錄下的 index.html 文件等等,具體是在 httpd.conf 中配置 DirectoryIndex。好吧,扯得太遠了,拽回來)
總之,我還是建議 URI 末尾不要帶 /,如果你非不聽,那就注釋上面那句 RewriteRule 吧,這樣就不會重定向了。
關于第 1 個問題,我們也來分析一下發生的原因,這樣才能對癥下藥。
根據錯誤提示,定位到文件 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 的原因就在以上代碼中。假設訪問:http://127.0.0.1/lumen/public,那么 :
phpvar_dump($method); // string(3) "GET" var_dump($pathInfo); // string(14) "/lumen/public/"
根據 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]) 的結果就是 false,所以提示 not be found 了。
既然已經知道了原因,那問題就好解決了。解決的前提是不要改動框架的源代碼,不然日后升級框架會多么蛋疼,你都把框架代碼都修改,萬一出了問題你咋辦?你自己拆手機,官方是不保修的哦!當然,如果你是框架開發組的,你提交代碼能被大家接受并被官方合并到主干代碼中了,那你就改吧。
修改 Apache 的配置文件 httpd.conf,將 DocumentRoot 指向 lumen/public:
bashDocumentRoot "/sites/lumen/public"
重啟 Apache。
但是,如果我還有其他站點也在這個 Apache 下面,改 DocumentRoot 就會導致其他的站點不能訪問了。怎么辦?請看方案 2。
方案2:配置 Apache 虛擬主機修改 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。
修改主機的 etc/hosts,添加一行:
bash127.0.0.1 lumen.app
其中 127.0.0.1 應該換成你 lumen 應用存放的機器的 ip。
OK,這樣就可以通過訪問 http://lumen.app 來訪問該 lumen 站點,通過 http://127.0.0.1 來訪問其他站點。
但是,你壓根不能修改 Apache 的配置,怎么辦?請看方案 3。
方案3.修改路由規則中的路徑改不了配置,就改代碼嘍(再強調一下,不是修改框架的源代碼)。
修改路由文件 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/");就可以了(當然,把這個寫到應用配置項中是最合適的,部署時修改配置就可以了)。
至于想以 "lumen/public/" 作為首頁 URI 顯然是不可以的,建議使用 "lumen/pulbic/index" 作為首頁。如同上面代碼定義的路由規則那樣。
因為,無論你在路由規則的字符串末尾加了多少個斜杠, $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 末尾還是不帶斜杠的好。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/30236.html
摘要:的現狀目前是版本,是基于開發。入口文件啟動文件和配置文件框架的入口文件是。在路由中指定控制器類必須寫全命名空間,不然會提示找不到類。目前支持四種數據庫系統以及。使用時發生錯誤,因為在文件中,的默認驅動是。 最近使用 Lumen 做了 2 個業余項目,特此記錄和分享一下。 Lumen 的介紹 在使用一項新的技術時,了解其應用場景是首要的事情。 Lumen 的口號:為速度而生的 La...
摘要:什么是官網是一個由組件搭建而成的微框架是當前最快的框架之一在什么時候使用專為微服務或者設計舉個例子如果你的應用里面有部分業務邏輯的請求頻率比較高就可以單獨把這部分業務邏輯拿出來使用來構建一個小因為是對優化了框架的加載機制所以對資源的要求少很 什么是 Lumen?官網 lumen 是一個由 Laravel 組件搭建而成的微框架,是當前最快的 PHP 框架之一! 在什么時候使用 Lume...
摘要:在開發中,用戶認證是核心,是數據是否有保障的前提,目前主要有兩種常用方式進行用戶認證和。附是為了在網絡應用環境間傳遞聲明而執行的一種基于的開放標準。 好久沒寫 PHP 代碼了,尤其是 Lumen,我是 Lumen 的忠實用戶,自從面世開始,我就將 Lumen 作為我 API 的主要框架使用。 但說到 API,不得不說的一個概念:「前后端分離」,現在越來越多的團隊都采用前后端分離,徹底解...
摘要:之前受到這篇為你的站點插上的翅膀的啟發就嘗試在中引入,并完成中文索引。關于中文索引谷歌上關于中文搜索的文章有很多,例如這篇。中文索引中涉及的內容比較多,下次再用一個篇幅來分析。 如何在Lumen中使用Elasticsearch 前言 Lumen是基于Laravel核心組件的微框架,隨著Laravel5的發布,目前版本也已經到5了。之前受到這篇為你的站點插上ElasticSearch...
閱讀 1540·2023-04-26 02:08
閱讀 3133·2021-10-14 09:42
閱讀 7208·2021-09-22 15:34
閱讀 3241·2019-08-30 13:16
閱讀 2731·2019-08-26 13:49
閱讀 1348·2019-08-26 11:59
閱讀 1272·2019-08-26 10:31
閱讀 2174·2019-08-23 17:19