在一切環境就緒了,當然就要開始了解框架了。
站在巨人的肩膀上,學東西會事半功倍。我在網上找到一篇好文章,正好可以讓我輕松了解Laravel應用程序的體系結構。因此借來直接用了。
該章節內容翻譯自《Architecture of Laravel Applications》,一切版權為原作者,由於原作者寫這篇文章時Laravel版本還沒有到4.1,一些地方有稍微差別,我會稍作修改。
原作者:Stable Host, LLC(不知道找對了沒有)
翻譯作者:Bowen Huang
正文:
Laravel被稱為“全棧”式框架,因為它處理從網絡服務到數據庫管理,直到HTML生成的一切事情,一個垂直集成的web開發環境能給開發者提供更好的體驗。
一個典型的程序員通過命令行工具與Laravel交互,生成和管理Laravel項目環境。Laravel帶有一個名為Artisan的優秀的命令行工具,可以用它來生成框架代碼和數據庫架構,Artisan能夠處理從數據庫架構遷移到資源和配置管理的一切事情。
約定優於配置
Laravel 的有趣的特征之一,在如何構建 web 應用程序上它規定了一些相當嚴重的限制。出人意料的是,這些限制使創建應用更加的容易——輕松了很多。讓我們來看看為什么。
Laravel區別於其他垂直集成開發環境在於它強烈的偏好約定優於配置。而一些 Java,Python 或 PHP 框架往往需要大量的 XML 配置,Laravel在開始的時候幾乎不需要配置(也許只有幾行在PHP中)。這種對配置文件的規避行為使其非常獨特,在所有 Laravel 應用程序中可識別的代碼結構是相同的。
一個項目結構來統治他們所有 !
這並不奇怪,所有Laravel項目基本上具有相同的目錄結構 ——在其中的每個文件都有其指定的地方。通過這種約定的目錄結果,可以確保開發者按照“Laravel way”工作。
圖 1.1 顯示了 Laravel 項目目錄結構是什么樣子:
圖1.1 Laravel 項目目錄結構
就如你看到這樣,laravel下面只包含了4個文件夾,這4個文件夾下面有一些子文件夾,這種豐富的子文件夾在第一次看到是不是有壓力?我會逐個介紹。我們大部分的開發工作都會在app/文件夾下面進行。
下面是各個文件夾和文件的基本介紹:
頂級文件夾 |
作用 |
app |
包含了站點的controllers(控制器),models(模型),views(視圖)和assets(資源)。這些是網站運行的主要代碼,你會將你大部分的時間花在這些上面。 |
bootstrap |
用來存放系統啟動時需要的文件,這些文件會被如index.php這樣的文件調用。 |
public |
這個文件夾是唯一外界可以看到的,是必須指向你web服務器的目錄。它含有laravel框架核心的引導文件index.php,這個目錄也可用來存放任何可以公開的靜態資源,如css,Javascript,images等。 |
vendor |
用來存放所有的第三方代碼,在一個典型的Laravel應用程序,這包括Laravel源代碼及其相關,並含有額外的預包裝功能的插件。 |
正如上面提到的,/app是所有的樂趣產生的地方,讓我們更深入的看看這個目錄的結構。
圖 1.2 顯示/app文件夾的詳細信息:
圖1.2 app 文件夾詳細信息
下面是詳細介紹:
文件的文件夾 |
作用 |
/app/config/ |
配置應用程序的運行時規則、 數據庫、 session等等。包含大量的用來更改框架的各個方面的配置文件。大部分的配置文件中返回的選項關聯PHP數組。 |
/app/config/app.php |
各種應用程序級設置,即時區、 區域設置(語言環境)、 調試模式和獨特的加密密鑰。 |
/app/config/auth.php |
控制在應用程序中如何進行身份驗證,即身份驗證驅動程序。 |
/app/config/cache.php |
如果應用程序利用緩存來加快響應時間,要在此配置該功能。 |
/app/config/compile.php |
在此處可以指定一些額外類,去包含由‘artisan optimize’命令聲稱的編譯文件。這些應該是被包括在基本上每個請求到應用程序中的類。 |
/app/config/database.php |
包含數據庫的相關配置信息,即默認數據庫引擎和連接信息。 |
/app/config/mail.php |
為電子郵件發件引擎的配置文件,即 SMTP 服務器,From:標頭 |
/app/config/session.php |
控制Laravel怎樣管理用戶sessions,即session driver, session lifetime。 |
/app/config/view.php |
模板系統的雜項配置。 |
/app/controllers |
包含用於提供基本的邏輯、 數據模型交互以及加載應用程序的視圖文件的控制器類。 |
/app/database/migrations/ |
包含一些 PHP 類,允許 Laravel更新當前數據庫的架構並同時保持所有版本的數據庫的同步。遷移文件是使用Artisan工具生成的。 |
/app/database/seeds/ |
包含允許Artisan工具用關系數據來填充數據庫表的 PHP 文件。 |
/app/lang/ |
PHP 文件,其中包含使應用程序易於本地化的字符串的數組。默認情況下目錄包含英語語言的分頁和表單驗證的語言行。 |
/app/models/ |
模型是代表應用程序的信息(數據)和操作數據的規則的一些類。在大多數情況下,數據庫中的每個表將對應應用中的一個模型。應用程序業務邏輯的大部分將集中在模型中。 |
/app/start/ |
包含與Artisan工具以及全球和本地上下文相關的自定義設置。 |
/app/storage/ |
該目錄存儲Laravel各種服務的臨時文件,如session, cache, compiled view templates。這個目錄在web服務器上必須是可以寫入的。該目錄由Laravel維護,我們可以不關心。 |
/app/tests/ |
該文件夾給你提供了一個方便的位置,用來做單元測試。如果你使用PHPUnit,你可以使用Artisan工具一次執行所有的測試。 |
/app/views/ |
該文件夾包含了控制器或者路由使用的HTML模版。請注意,這個文件夾下你只能放置模版文件。其他的靜態資源文件如css, javascript和images文件應該放在/public文件夾下。 |
/app/routes.php |
這是您的應用程序的路由文件,其中包含路由規則,告訴 Laravel 如何將傳入的請求連接到路由處理的閉包函數、 控制器和操作。該文件還包含幾個事件聲明,包括錯誤頁的,可以用於定義視圖的composers。 |
/app/filters.php |
此文件包含各種應用程序和路由篩選方法,用來改變您的應用程序的結果。Laravel 具有訪問控制和 XSS 保護的一些預定義篩選器。 |
花了很多心思在建立和命名文件夾上,得到的就是一個具有良好的文件系統的應用程序。
在這里你得到了什么:MVC
模型-視圖-控制器(MVC)
讓我們進入Laravel應用工作的高級別概述。你可能已經注意到了標准的Laravel應用程序結構由一個應用程序目錄app/,它含有三個子目錄:models/,views/和controllers/。這就透露了Laravel遵循model-view-controller(MVC)架構模式,就是強制將輸入到展示邏輯關系的“業務邏輯”與圖形用戶界面(GUI)分開。就Laravel web應用而言,業務邏輯通常由像用戶,博客文章這樣的數據模型組成。GUI只是瀏覽器中的網頁而已。MVC設計模式在網頁開發領域很流行。
MVC模式的3個組件:
- 模型(model)
- 視圖(view)
- 控制器(controller)
[注] 原作者在這里詳細介紹了MVC三個組成部分,我這里由於篇幅就不介紹了。
Laravel組件
一個典型的Laravel應用程序包含上面提到的MVC組件,如下圖:
當與Laravel交互時,瀏覽器發送一個請求,web服務器接收到請求並且傳給Laravel路由引擎。Laravel路由接收到請求,然后重定向給基於路由的URL模式的合適的控制器類方法。
然后控制器類接管。在某種情況下,控制器會立即呈現出一個視圖,它是一個被轉換成HTML並送回瀏覽器的模版。更常見的動態網站,控制器與模型交互,這是一個PHP對象,它表示應用程序(如用戶、博客文章)中的一個元素,並負責與數據庫進行通信的。調用模型后,控制器則呈現最終視圖( HTML,CSS和圖像),並返回完整的網頁到用戶的瀏覽器。
Laravel促進了這樣的概念——模型、視圖和控制器,應通過存儲這些元素在不同的目錄中的單獨的代碼文件中來保持相當的獨立性。這就是Laravel目錄結構發揮了作用。
像MVC這樣的設計模式的產生,就是為了讓開發者的生活更加的輕松。這就是Laravel比那些不用任何模式的PHP厲害的地方。如果這種討論很抽象,現在,不用擔心!當你開始Laravel工作,你都不會意識到你是在一種設計模式中工作。過一段時間后,就會變得自然了。
數據模型
數據模型是任何應用程序的基礎,它描述了應用程序的業務邏輯。任何一塊的數據都是用數據庫表來表示的。Laravel提供了一些技術來簡化對數據庫的訪問。
Laravel通過將數據庫中的表行轉成能被輕松操縱的PHP對象,來連接應用程序的數據模型和數據庫表。它還使您能夠執行業務規則,描述在應用程序中不同的數據模型之間的關系等。例如,一個人的家庭關系可以用Laravel Eloquent OR / M描述如下:
1 class Person extends Eloquent 2 { 3 public function mother() 4 { 5 return $this->belongsTo('Mother'); 6 } 7 8 public function father() 9 { 10 return $this->belongsTo('Father'); 11 } 12 13 public function spouse() 14 { 15 return $this->hasOne('Spouse'); 16 } 17 18 public function sisters() 19 { 20 return $this->hasMany('Sister'); 21 } 22 23 public function brothers() 24 { 25 return $this->hasMany('Brother'); 26 } 27 }
如果翻譯有什么錯誤,歡迎指出來。
未完待續……