摘要:的現(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 的口號:為速度而生的 Laravel 框架
Lumen 的定位:微框架
Lumen 的應(yīng)用場景:Lumen 專為微服務(wù)或者 API 設(shè)計(jì)
Lumen 的優(yōu)點(diǎn):構(gòu)建在 Laravel 之上, 使其具備 Laravel 強(qiáng)大的功能
Lumen 包含了 Laravel 的哪些功能:
Blade 模版引擎
Caching 緩存系統(tǒng)
Command Scheduler 計(jì)劃任務(wù)
Controllers 控制器
Eloquent ORM 數(shù)據(jù)庫操作
Error Handling 錯(cuò)誤處理
Database Abstraction 數(shù)據(jù)庫抽象層
Dependency Injection 依賴注入
Logging 日志系統(tǒng)
Queued Jobs 隊(duì)列系統(tǒng)
以上內(nèi)容來自:Lumen 的介紹,建議點(diǎn)擊閱讀詳情。
Lumen 的現(xiàn)狀目前是1.0 版本,是基于 Laravel 5.x 開發(fā)???github 上作者更新的很勤快,但是這也導(dǎo)致文檔和實(shí)際情況有不一致的情況,變動(dòng)也比較頻繁。吐個(gè)槽:也許,我下面說的一些情況都發(fā)生了變化。
和 Laravel 最大的區(qū)別既然是為了快速而生,砍掉功能的必然的,功能的有或無,事先了解到即可,倒不算作最大的區(qū)別。我認(rèn)為可見的最大變化是:
Lumen 沒有使用 Symfony 的路由模塊, 而是采用了速度更加快的 nikic/fast-route。
這個(gè)變化也延伸出其他的一些變化,比如和路由相關(guān)的一些 helper 函數(shù)也少了。
不可見的變化:我猜想框架的初始化機(jī)制應(yīng)該也發(fā)生了很大的變化,但是對于使用框架并沒有可見的影響。因?yàn)槲覜]有深入去讀框架源碼,所以也不敢亂說。
Artisan 命令Lumen 下的 Artisan 命令比 Laravel 的少很多。這個(gè)在項(xiàng)目下運(yùn)行 php artisan,和 Laravel 的比較一下就知道了。
但是,有些命令沒有也不影響原有功能的使用,畢竟 Artisan 命令工具只是起到輔助開發(fā)和提高效率的作用。
在 Laravel 中,要?jiǎng)?chuàng)建一個(gè)新的自定義命令,可以使用 make:console 這個(gè) Artisan 命令。比如:php artisan make:console FooCommand。
但是,在 Lumen 中沒有這個(gè) Artisan 命令。于是,我在 Laravel 下使用該命令,生成了文件 app/Console/Commands/FooCommand.php。我將文件復(fù)制到 Lumen 項(xiàng)目中的 app/Console/Commands/ 的目錄下,并按照 Laravel 的文檔 Artisan 開發(fā)編寫,成功運(yùn)行。之后,我使用該方式創(chuàng)建了兩個(gè)具有完整功能的 Artisan 命令(一個(gè)是爬蟲并和 MySQL 交互,另一個(gè)是和 Redis 交互),目前尚沒有發(fā)現(xiàn)有任何問題。
框架的入口文件是 public/index.php。里面也只有兩行代碼:
php$app = require __DIR__."/../bootstrap/app.php"; $app->run();
啟動(dòng)并運(yùn)行。
閱讀 bootstrap/app.php 文件還是很重要的,下面的內(nèi)容幾乎都有涉及這個(gè)文件。
Lumen 的配置文件是項(xiàng)目根目錄下的 .env文件,官方給出了一個(gè)例子文件:.env.example。需要在 bootstrap/app.php 中將 Dotenv::load(__DIR__ . "/../");的注釋去掉才能使用 .env,幾乎很多操作都依賴這個(gè),不知道為什么它默認(rèn)是加上注釋的。
在 bootstrap/app.php 中,最后兩行代碼是:
phprequire __DIR__ . "/../app/Http/routes.php"; return $app;
路由定義在文件 app/Http/routes.php 中。里面給出了一個(gè)例子:
php$app->get("/", function() use ($app) { return $app->welcome(); });
路由的詳情可以參見文檔 HTTP 路由。
這里我想吐個(gè)槽,$app->welcome 這個(gè)可能是為了測速而耍的小伎倆,因?yàn)?welcome 這個(gè)方法只是單純輸出 HTML 歡迎頁,但是是直接寫在 LaravelLumenApplication 類中的,這不科學(xué)。
在路由中指定控制器類必須寫全命名空間,不然會提示找不到類。
php$app->get("/test", array( "uses" => "AppHttpControllersTestController@getIndex", ));
這個(gè)和 Laravel 不同,在 Laravel 中是可以不必指定 AppHttpControllers:
php$app->get("/test", array( "uses" => "TestController@getIndex", ));
因?yàn)樵?Laravel 中,默認(rèn)控制器的根命名空間為 AppHttpControllers。這個(gè)也可以設(shè)置:URL::setRootControllerNamespace("AppHttpControllers");。參見 Laravel 文檔:HTTP 控制器。
但是,在 Lumen 中,這些都是沒有的。我只在框架源碼中找到接口 UrlGenerator 中有 setRootControllerNamespace 的定義,并沒有找到實(shí)現(xiàn)。我猜這個(gè)應(yīng)該也是換路由帶來的影響,不知道后面會不會有修改。
如果實(shí)在不想重復(fù)寫全命名空間,除了定義一個(gè)變量(或常量)外,還有一種旁門左道的方法,使用組路由:
php$app->group(array("namespace" => "AppHttpControllers"), function () use ($app) { $app->get( "/login", array( "as" => "login", "uses" => "PassportController@getLogin", )); });
畢竟是旁門左道,我其實(shí)的拒絕的。
FacadesFacades 提供一個(gè)靜態(tài)接口給在應(yīng)用程序的服務(wù)容器中可以取用的類
比如:
phpCache::put("key", "value", $minutes); DB::getQueryLog()
在 Lumen 中,這個(gè)功能默認(rèn)是沒有開啟的。開啟方式是去掉 bootstrap/app.php 中 $app->withFacades(); 的注釋。
當(dāng)然,如果不開啟,也不礙事:
phpuse IlluminateSupportFacadesCache; use IlluminateSupportFacadesDB; Cache::put("key", "value", $minutes); DB::getQueryLog();
Lumen 中可以使用的 Facades,查看源代碼,可用清單如下:
phppublic function withFacades() { Facade::setFacadeApplication($this); if (! static::$aliasesRegistered) { static::$aliasesRegistered = true; class_alias("IlluminateSupportFacadesApp", "App"); class_alias("IlluminateSupportFacadesAuth", "Auth"); class_alias("IlluminateSupportFacadesBus", "Bus"); class_alias("IlluminateSupportFacadesDB", "DB"); class_alias("IlluminateSupportFacadesCache", "Cache"); class_alias("IlluminateSupportFacadesCookie", "Cookie"); class_alias("IlluminateSupportFacadesCrypt", "Crypt"); class_alias("IlluminateSupportFacadesEvent", "Event"); class_alias("IlluminateSupportFacadesHash", "Hash"); class_alias("IlluminateSupportFacadesLog", "Log"); class_alias("IlluminateSupportFacadesMail", "Mail"); class_alias("IlluminateSupportFacadesQueue", "Queue"); class_alias("IlluminateSupportFacadesRequest", "Request"); class_alias("IlluminateSupportFacadesSchema", "Schema"); class_alias("IlluminateSupportFacadesSession", "Session"); class_alias("IlluminateSupportFacadesStorage", "Storage"); class_alias("IlluminateSupportFacadesValidator", "Validator"); } }數(shù)據(jù)庫和 Eloquent
數(shù)據(jù)庫相關(guān)配置信息在 .env 文件里面, DB_* 開頭。 你可以定義所有的數(shù)據(jù)庫連接。目前 Lumen 支持四種數(shù)據(jù)庫系統(tǒng):MySQL、Postgres、SQLite、以及 SQL Server。
數(shù)據(jù)庫和 Eloquent ORM 和 Laravel 中的用法一樣,看 Laravel 的相關(guān)文檔即可。
數(shù)據(jù)庫操作日志默認(rèn)是關(guān)閉的,啟動(dòng)方式:
phpDB::connection()->enableQueryLog();
詳情參見:查找日志記錄。
在 Lumen 中如果需要使用 Eloquent ORM,應(yīng)該去掉 bootstrap/app.php 中 $app->withEloquent(); 的注釋。
詳情參見:數(shù)據(jù)庫使用基礎(chǔ)。
Session 默認(rèn)未開啟。
開啟方式:去掉 bootstrap/app.php 中 $app->middleware(); 的 StartSession 中間件的注釋。
使用時(shí)發(fā)生錯(cuò)誤:Class "Memcached" not found ,因?yàn)樵?.env 文件中,Session 的默認(rèn)驅(qū)動(dòng)是:memcached。修改即可。
目前支持的驅(qū)動(dòng)有:file、cookie、database、memcached、redis、array。詳情參見:會話。
對了,說一句,重定向的功能有依賴于 Session。
Cookie如果你想讓所有的 Cookie 都加密的話, 你需要把 bootstrap/app.php 的 EncryptCookies 中間件去掉注釋. Lumen 所建立的 cookie 會加密并且加上認(rèn)證記號,這代表著被用戶擅自更改的 cookie 會失效。
一般使用 cookie 都是伴著 Response 對象返回給客戶端的:
php$response->withCookie(cookie("name", "value", $minutes)); return $response;
如果不喜歡上面那種方式,還有另外一種:
phpCookie::queue("name", "value"); return $response;
但是:
總結(jié)你需要在 bootstrap/app.php 文件里面注釋掉 AddQueuedCookiesToResponse 這一行來使用此功能.
最后說一下,Lumen 定位是微框架,Laravel 定位是全棧框架。使用一項(xiàng)技術(shù)時(shí),得先了解一下它適用的場景。Lumen 的適用場景,官方有介紹:在什么時(shí)候使用 Lumen?。如果場景不對,那么 Lumen 的優(yōu)勢(比如:速度、簡單)可能就發(fā)揮不出來,而劣勢卻會更加凸顯。如果想用 Lumen 做太多太復(fù)雜的事情,還是直接上 Laravel。不然,你可能會覺得 Lumen 怎么這也沒有那也不行的(尤其是用過 Laravel,這種感覺可能更甚)。好在 Lumen 本身和 Laravel 出自同門,Lumen 向 Laravel 遷移是很容易的事情,代碼改動(dòng)量并不大。
最后的最后,如果熟悉 Laravel,那么學(xué)習(xí) Lumen 的成本是極低的。
祝玩的愉快!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/20979.html
摘要:介紹為速度而生的框架。是官方給出的例子,直接拷貝命名為。一般來說,我們應(yīng)該避免使用末尾帶斜杠的。因?yàn)樗绻也坏轿募?,就會自?dòng)在末尾加個(gè)斜杠,嘗試尋找目錄下的文件等等,具體是在中配置。方案修改修改的配置文件,將指向重啟。 介紹 Lumen:為速度而生的 Laravel 框架。 Lumen 是 Laravel 的作者(Taylor Otwell)的又一力作。簡單、快速、優(yōu)雅的它的特點(diǎn)...
摘要:接前一篇,阿里初體驗(yàn)一我們繼續(xù)我們的之旅。注意到,目錄里和兩個(gè)文件夾,這里也是我們編寫業(yè)務(wù)邏輯的主要地方。用于解析用戶的輸入,處理后返回相應(yīng)的結(jié)果。在使用導(dǎo)出的模塊時(shí),需要把導(dǎo)出的模塊名改為駝峰標(biāo)準(zhǔn),且首字母變?yōu)樾憽? 接前一篇,阿里egg.js初體驗(yàn)(一) 我們繼續(xù)我們的egg之旅。我們已經(jīng)完成了對于項(xiàng)目結(jié)構(gòu)的搭建,現(xiàn)在我們需要開始業(yè)務(wù)的編寫。注意到,目錄里controller和se...
摘要:在開發(fā)中,用戶認(rèn)證是核心,是數(shù)據(jù)是否有保障的前提,目前主要有兩種常用方式進(jìn)行用戶認(rèn)證和。為了學(xué)習(xí)在中的使用,最好的辦法就是在程序員同志網(wǎng)搜索有關(guān)插件,找個(gè)最多的那個(gè)拿來研究研究。 通過上一篇《學(xué)習(xí) Lumen 用戶認(rèn)證 (一)》https://mp.weixin.qq.com/s/KVUQE2DUetNB2kqxHs0VDg的學(xué)習(xí),大致懂了 Lumen 的用戶認(rèn)證主要使用 「api」的...
摘要:繼續(xù)學(xué)習(xí)分割線看看是怎么輸出這個(gè)數(shù)據(jù)目錄下的加載了下的的自動(dòng)加載加載的配置初始化應(yīng)用初始化的內(nèi)容指定項(xiàng)目基礎(chǔ)目錄注冊服務(wù)容器注冊異常處理實(shí)例 繼續(xù)學(xué)習(xí)lumen5.5 -----------------------分割線----------------------- 看看是怎么輸出Lumen (5.5.2) (Laravel Components 5.5.*)這個(gè)數(shù)據(jù) public目錄...
摘要:初始化在終端中執(zhí)行。首次執(zhí)行初始化操作,會有較長的時(shí)間去獲取中定義的信息,在第一次初始化后沒有信息的變化,可以跳過初始化直接開始部署。執(zhí)行部署命令時(shí),會將的列出來展示給用戶,并由用戶確定執(zhí)行。則刪除由創(chuàng)建的容器。通過Terraform在本地運(yùn)行docker nginx前置條件: 1. 安裝好windows docker 2. 安裝好terraform安裝docker安裝windows doc...
閱讀 3569·2023-04-25 16:35
閱讀 714·2021-10-11 11:09
閱讀 6192·2021-09-22 15:11
閱讀 3362·2019-08-30 14:03
閱讀 2604·2019-08-29 16:54
閱讀 3356·2019-08-29 16:34
閱讀 3063·2019-08-29 12:18
閱讀 2132·2019-08-28 18:31