一. 請求週期
Laravel 採用了單一入口模式,應用的所有請求入口都是 public/index.php 文檔。
註冊類文檔自動加載器:Laravel通過composer進行依賴管理,並在bootstrap/autoload.php中註冊了Composer Auto Loader (PSR-4),應用中類的命名空間將被映射到類文檔實際路徑,不再需要開發者手動導入各種類文檔,而由自動加載器自行導入。因此,Laravel允許你在應用中定義的類可以自由放置在Composer Auto Loader能自動加載的任何目錄下,但大多數時候還是建議放置在app目錄下或app的某個子目錄下
創建服務容器:從 bootstrap/app.php 文檔中取得 Laravel 應用實例 $app (服務容器)
創建 HTTP / Console 內核:傳入的請求會被髮送給 HTTP 內核或者 console 內核進行處理,HTTP 內核繼承自 Illuminate\Foundation\Http\Kernel 類。它定義了一個bootstrappers 數組,數組中的類在請求真正執行前進行前置執行,這些引導進程配置了錯誤處理,日誌記錄,檢測應用進程環境,以及其他在請求被處理前需要完成的工作;HTTP內核同時定義了一個HTTP 中間件列表,所有的請求必須在處理前通過這些中間件處理HTTP session 的讀寫,判斷應用是否在維護模式, 驗證CSRF token 等等
載入服務提供者至容器:在內核引導啟動的過程中最重要的動作之一就是載入服務提供者到你的應用,服務提供者負責引導啟動框架的全部各種組件,例如數據庫、隊列、驗證器以及路由組件。因為這些組件引導和配置了框架的各種功能,所以服務提供者是整個 Laravel 啟動過程中最為重要的部分,所有的服務提供者都配置在 config/app.php 文檔中的 providers 數組中。首先,所有提供者的 register 方法會被調用;一旦所有提供者註冊完成,接下來,boot 方法將會被調用
分發請求:一旦應用完成引導和所有服務提供者都註冊完成,Request 將會移交給路由進行分發。路由將分發請求給一個路由或控制器,同時運行路由指定的中間件
二. 服務容器和服務提供者
服務容器是Laravel 管理類依賴和運行依賴注入的有力工具,在類中可通過$this->app 來訪問容器,在類之外通過$app 來訪問容器;服務提供者是Laravel 應用進程引導啟動的中心,關係到服務提供者自身、事件監聽器、路由以及中間件的啟動運行。應用進程中註冊的路由通過RouteServiceProvider實例來加載;事件監聽器在EventServiceProvider類中進行註冊;中間件又稱路由中間件,在app/Http/Kernel.php類文檔中註冊,調用時與路由進行綁定。在新創建的應用中,AppServiceProvider 文檔中方法實現都是空的,這個提供者是你添加應用專屬的引導和服務的最佳位置,當然,對於大型應用你可能希望創建幾個服務提供者,每個都具有粒度更精細的引導。服務提供者在 config/app.php 配置文檔中的providers數組中進行註冊
三、Artisan Console
Laravel利用PHP的CLI構建了強大的Console工具artisan,artisan幾乎能夠創建任何你想要的模板類以及管理配置你的應用,在開發和運維管理中扮演着極其重要的角色,artisan是Laravel開發不可或缺的工具。在Laravel根目錄下運行:PHP artisan list可查看所有命令行表。用好artisan能極大地簡化開發工作,並減少錯誤發生的可能;另外,還可以編寫自己的命令。下面列舉部分比較常用的命令:
啟用維護模式:php artisan down --message='Upgrading Database' --retry=60
關閉維護模式:php artisan up
生成路由緩存:php artisan route:cache
清除路由緩存:php artisan route:clear
數據庫遷移 Migrations:php artisan make:migration create_users_table --create=users
創建資源控制器:php artisan make:controller PhotoController --resource --model=Photo
創建模型及遷移:php artisan make:model User -m
四、表單驗證機制
表單驗證在web開發中是不可或缺的,其重要性也不言而喻,也算是每個web框架的標配部件了。Laravel表單驗證擁有標準且龐大的規則集,通過規則調用來完成數據驗證,多個規則組合調用須以“|”符號連接,一旦驗證失敗將自動回退並可自動綁定視圖。
下例中,附加bail規則至title屬性,在第一次驗證required失敗後將立即停止驗證;“.”語法符號在Laravel中通常表示嵌套包含關係,這個在其他語言或框架語法中也比較常見
$this->validate($request, [
'title' => 'bail|required|unique:posts|max:255',
'author.name' => 'required',
'author.description' => 'required',
]);
五、Eloquent 模型
Eloquent ORM 以ActiveRecord形式來和數據庫進行交互,擁有全部的數據表操作定義,單個模型實例對應數據表中的一行
1 $flights = App\Flight::where('active', 1)
2 ->orderBy('name', 'desc')
3 ->take(10)
4 ->get();
config/database.php中包含了模型的相關配置項。Eloquent 模型約定:
數據表名:模型以單數形式命名(CamelCase),對應的數據表為蛇形複數名(snake_cases),模型的$table屬性也可用來指定自定義的數據表名稱
主鍵:模型默認以id為主鍵且假定id是一個遞增的整數值,也可以通過$primaryKey來自定義;如果主鍵非遞增數字值,應設置$incrementing = false
時間戳:模型會默認在你的數據庫表有 created_at 和 updated_at 字段,設置$timestamps = false可關閉模型自動維護這兩個字段;$dateFormat 屬性用於在模型中設置自己的時間戳格式
數據庫連接:模型默認會使用應用進程中配置的數據庫連接,如果你想為模型指定不同的連接,可以使用 $connection 屬性自定義
批量賦值:當用户通過 HTTP 請求傳入了非預期的參數,並藉助這些參數 create 方法更改了數據庫中你並不打算要更改的字段,這時就會出現批量賦值(Mass-Assignment)漏洞,所以你需要先在模型上定義一個 $fillable(白名單,允許批量賦值字段名數組) 或 $guarded(黑名單,禁止批量賦值字段名數組)
1 // 用屬性取回航班,當結果不存在時創建它...
2 $flight = App\Flight::firstOrCreate(['name' => 'Flight 10']);
3
4 // 用屬性取回航班,當結果不存在時實例化一個新實例...
5 $flight = App\Flight::firstOrNew(['name' => 'Flight 10']);
六、Laravel的Restful風格
一般認為Restful風格的資源定義不包含操作,但是在Laravel中操作(動詞)也可作為一種資源來定義。下圖是對Laravel中資源控制器操作原理的描述,可以看到,create、edit就直接出現在了URI中,它們是一種合法的資源。對於create和edit這兩種資源的訪問都採用GET方法來實現,第一眼看到頓感奇怪,後來嘗試通過artisan console生成資源控制器,並注意到其對create、edit給出註釋“ Show the form for ”字樣,方知它們只是用來展現表單而非提交表單的。
2018年11月20日 星期二
訂閱:
張貼留言 (Atom)
熱門文章
-
從零開始:使用 FastAPI、MySQL 和 Docker 打造你的第一個電商購物車應用 引言: 哈囉,各位程式碼愛好者!你是否曾經想過要打造一個自己的網路應用程式,卻不知道從何開始?特別是對 Python 有興趣的初學者,常常會被複雜的 Web 框架和部署流程嚇到。別擔心!今...
-
資深前端工程師面試指南:Nuxt 3 生命週期與 SSR、CSR、SSG 渲染策略 在資深前端工程師的面試中, Nuxt 3 是一個熱門話題,尤其是其生命週期以及伺服器端渲染 (SSR)、客戶端渲染 (CSR) 和靜態生成 (SSG) 的應用場景。這些議題不僅考驗對框架的...
-
在資料庫設計中, 正規化 (Normalization) 和 反正規化 (Denormalization) 是兩種截然不同的策略,各有其優缺點,通常需要在實際應用場景中權衡選擇。 一、正規化 (Normalization) 定義 正規化是一套系統性的方法,用於設計關聯式資...
-
🚀 AI 革命:技術人員必須掌握的三大核心機會點 💡 前言:從「數位化」到「認知化」的範式轉移 網際網路將世界資訊 數位化 ,讓存取和傳輸成為可能。而我們正處於人工智慧(AI)革命的開端,這場革命將實現 認知和決策的自動化 。對於技術開發者、工程師和架構師而言,這不僅僅是工具...
-
PHP 多執行緒與非阻塞實戰:台灣工程師的務實選擇 前言 身為 PHP 工程師,我們常會遇到需要處理耗時操作的場景,例如發送大量郵件、處理圖片或進行複雜運算。如果這些操作都循序執行,很容易造成程式卡住,使用者體驗當然不好。這時候,「非阻塞」與「多執行緒」的概念就顯得非常重要了。 ...
-
我的第一個 FastAPI 微服務:當 Laravel 遇上智能文件辨識 作為一名主要使用 PHP (尤其是 Laravel) 進行開發的工程師,我始終對探索新的技術棧充滿熱情。最近,我將目光投向了 Python 生態系統,特別是 FastAPI ,並成功地將其與我熟悉的 Lar...
-
Vue 3 WebSocket 聊天室架構設計與實戰教學 實現高彈性、高安全的即時通訊服務 By [您的名字或暱稱] | 資深全端工程師與系統架構師 當我們從傳統的 HTTP 架構轉向 即時(Real-Time) 應用時,WebSocket 幾乎是唯一的選擇。然而,一個生產環境...
-
Django CRM 從零開始:為初學者打造的逐步教學 (重新排版) 嗨,Django 新手們!準備好踏上開發一個實用且功能強大的 CRM (客戶關係管理) 系統的旅程了嗎?Django 是一個高效的 Web 框架,它能讓您快速地建立複雜的資料庫驅動型應用程式。本教學將帶領您從零...
-
駕馭單線程的藝術:JavaScript 與 PHP 的高併發與並行架構解密 引言:跳脫「單線程」的迷思與工程師的取捨 許多初階工程師一聽到 JavaScript (Node.js) 或 PHP 是單線程,就武斷地認為它們無法處理高併發或並行計算。這錯了。 單線程只是語言執行模...
-
標題: PHP 資深工程師的 CI/CD 實踐:從概念到自動化部署的深度解析 前言:CI/CD — 現代軟體開發的加速器 在快節奏的軟體開發世界裡, 快速、可靠地交付高品質的程式碼 是每個開發團隊的共同目標。而實現這一目標的關鍵利器,就是 CI/CD (Continuous...

沒有留言:
張貼留言