在一切環境就緒了,固然就要開始瞭解框架了。javascript
站在巨人的肩膀上,學東西會事半功倍。我在網上找到一篇好文章,正好可讓我輕鬆瞭解Laravel應用程序的體系結構。所以借來直接用了。php
該章節內容翻譯自《Architecture of Laravel Applications》,一切版權爲原做者,因爲原做者寫這篇文章時Laravel版本尚未到4.1,一些地方有稍微差異,我會稍做修改。css
原做者:Stable Host, LLC(不知道找對了沒有)java
翻譯做者:Bowen Huanglaravel
正文:程序員
Laravel被稱爲「全棧」式框架,由於它處理從網絡服務到數據庫管理,直到HTML生成的一切事情,一個垂直集成的web開發環境能給開發者提供更好的體驗。web
一個典型的程序員經過命令行工具與Laravel交互,生成和管理Laravel項目環境。Laravel帶有一個名爲Artisan的優秀的命令行工具,能夠用它來生成框架代碼和數據庫架構,Artisan可以處理從數據庫架構遷移到資源和配置管理的一切事情。數據庫
Laravel 的有趣的特徵之一,在如何構建 web 應用程序上它規定了一些至關嚴重的限制。出人意料的是,這些限制使建立應用更加的容易——輕鬆了不少。讓咱們來看看爲何。bootstrap
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
讓咱們進入Laravel應用工做的高級別概述。你可能已經注意到了標準的Laravel應用程序結構由一個應用程序目錄app/,它含有三個子目錄:models/,views/和controllers/。這就透露了Laravel遵循model-view-controller(MVC)架構模式,就是強制將輸入到展現邏輯關係的「業務邏輯」與圖形用戶界面(GUI)分開。就Laravel web應用而言,業務邏輯一般由像用戶,博客文章這樣的數據模型組成。GUI只是瀏覽器中的網頁而已。MVC設計模式在網頁開發領域很流行。
MVC模式的3個組件:
[注] 原做者在這裏詳細介紹了MVC三個組成部分,我這裏因爲篇幅就不介紹了。
一個典型的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 }