Laravel 5.0 在默認的項目上引進了新的應(yīng)用程序架構(gòu)。新的架構(gòu)提供了更好的功能來構(gòu)建健壯的 Laravel 應(yīng)用程序,以及在應(yīng)用程序中全面采用新的自動加載標準( PSR-4 )。首先,來查看一些主要變更:
舊的 app/models
目錄已經(jīng)完全被移除。相對的,你所有的代碼都放在 app
目錄下,以及默認使用 App
命名空間。這個默認的命名空間可以使用新的 app:name
Artisan 命令來快速更改。
控制器( controller ),中間件( middleware ),以及請求( requests,Laravel 5.0 中新型態(tài)的類別),現(xiàn)在都存放在 app/Http
的對應(yīng)目錄下,因為他們都與應(yīng)用程序的 HTTP 傳輸層相關(guān)。除了一個路由設(shè)置的文件外,所有的中間件現(xiàn)在都拆分開成單獨的類文件。
新的 app/Providers
目錄取代了舊版 Laravel 4.x app/start
里的文件。這些服務(wù)提供者有很多啟動應(yīng)用程序相關(guān)的方法,像是錯誤處理,日志記錄,路由加載,以及更多。當然,你可以自由的建立新的服務(wù)提供者到應(yīng)用程序。
應(yīng)用程序的語言文件和視圖都移到 resources
目錄下。
所有 Laravel 主要組件實現(xiàn)所用的接口都放在 illuminate/contracts
項目下。這個項目沒有其他的外部依賴。這些方便、集成的接口,可以讓你用來讓依賴注入變得低耦合,將可以簡單作為 Laravel Facades 的替代選項。
更多關(guān)于 contracts 的信息,參考完整文檔。
如果你的應(yīng)用程序全部都是使用控制器路由,你可以使用新的 route:cache
Artisan 命令大幅度地加快路由注冊。這對于有 100 個以上路由規(guī)則的應(yīng)用程序很有用,可以大幅度地加快應(yīng)用程序這部分的處理速度。
除了像 Laravel 4 風格的路由「過濾器( filters )」,Laravel 5 現(xiàn)在也支持 HTTP 中間件,而原本的認證和 CSRF 「過濾器」已經(jīng)改寫成中間件。中間件提供了單一、一致的接口取代了各種過濾器,讓你在請求進到應(yīng)用程序前,可以方便地檢查甚至拒絕請求。
更多關(guān)于中間件的信息,參考完整文檔。
除了之前有的控制器依賴注入,你現(xiàn)在可以在控制器方法使用類型提示( type-hint )進行依賴注入。服務(wù)容器會自動注入依賴,即使路由包含了其他參數(shù)也不成問題:
public function createPost(Request $request, PostRepository $posts){ //}
用戶注冊,認證,以及重設(shè)密碼的控制器現(xiàn)在已經(jīng)默認含括了,包含相對應(yīng)的視圖,放在 resources/views/auth
。除此之外, 「users」 數(shù)據(jù)表遷移也已經(jīng)默認存在框架中了。這些簡單的資源,可以讓你快速開發(fā)應(yīng)用程序的業(yè)務(wù)邏輯,而不用陷在撰寫認證模板的泥潭上。認證相關(guān)的視圖可以經(jīng)由 auth/login
以及 auth/register
路由訪問。App\Services\Auth\Registrar
服務(wù)會負責處理用戶認證和添加的相關(guān)邏輯。
你現(xiàn)在可以將事件定義成對象,而不是僅使用字串。例如,查看以下的事件:
class PodcastWasPurchased { public $podcast; public function __construct(Podcast $podcast) { $this->podcast = $podcast; }}
這個事件可以像一般使用那樣被派發(fā):
Event::fire(new PodcastWasPurchased($podcast));
當然,你的事件處理會收到事件的對象而不是數(shù)據(jù)的列表:
class ReportPodcastPurchase { public function handle(PodcastWasPurchased $event) { // }}
更多關(guān)于使用事件的信息,參考完整文檔。
除了 Laravel 4 形式的隊列任務(wù),Laravel 5 以簡單的命令對象作為隊列任務(wù)。這些命令放在 app/Commands
目錄下。下面是個簡單的命令:
class PurchasePodcast extends Command implements SelfHandling, ShouldBeQueued { use SerializesModels; protected $user, $podcast; /** * Create a new command instance. * * @return void */ public function __construct(User $user, Podcast $podcast) { $this->user = $user; $this->podcast = $podcast; } /** * Execute the command. * * @return void */ public function handle() { // Handle the logic to purchase the podcast... event(new PodcastWasPurchased($this->user, $this->podcast)); }}
Laravel 的基底控制器使用了新的 DispatchesCommands
trait,讓你可以簡單的派發(fā)命令執(zhí)行。
$this->dispatch(new PurchasePodcastCommand($user, $podcast));
當然,你也可以將命令視為同步執(zhí)行(而不會被放到隊列里)的任務(wù)。事實上,使用命令是個好方式,讓你可以封裝應(yīng)用程序需要執(zhí)行的復(fù)雜任務(wù)。更多相關(guān)的信息,參考 command bus 文檔。
database
隊列驅(qū)動現(xiàn)在已經(jīng)包含在 Laravel 中了,提供了簡單的本地端隊列驅(qū)動,讓你除了數(shù)據(jù)庫相關(guān)軟件外不需安裝其他套件。
過去,開發(fā)者可以產(chǎn)生 Cron 設(shè)置,用以調(diào)用所有他們想要執(zhí)行的命令行指令。然而,這是件很頭痛的事情,你的命令行調(diào)用不再屬于版本控制的一部分,而你必須 SSH 到服務(wù)器里加入 Cron 設(shè)置。
為了讓生活變得簡單點, 讓你可以流暢而且具有表達性的在 Laravel 里面定義你的命令調(diào)用,而且服務(wù)器只需要單一個 Cron 設(shè)置。
它會看起來如下:
$schedule->command('artisan:command')->dailyAt('15:00');
當然,快參考完整文檔學習所有調(diào)用相關(guān)知識。
php artisan tinker
命令現(xiàn)在使用 Justin Hileman 的 Psysh,一個 PHP 更強大的 REPL。如果你喜歡 Laravel 4 的 Boris,你也會喜歡上 Psysh。更好的是,它可以跑在 Windows!要開始使用,只要輸入:
php artisan tinker
比起一堆令人困惑的、嵌套的環(huán)境配置文件目錄,Laravel 5 現(xiàn)在使用了 Vance Lucas 的 DotEnv。這個套件提供了超級簡單的方式管理配置文件,并且讓 Laravel 5 環(huán)境檢測變得輕松。更多的細節(jié),參考完整的配置文件文檔。
Jeffrey Way 的 Laravel Elixir 提供了一個流暢、語義化的接口,可以編譯以及合并 assets。如果你曾經(jīng)在學習 Grunt 或 Gulp 被嚇到,不必再害怕了。Elixir 讓使用 Gulp 編譯 Less、Sass 及 CoffeeScript 變得簡單。它甚至可以幫你執(zhí)行測試!
更多關(guān)于 Elixir 的信息,參考完整文檔。
Laravel Socialite 是個可選的,Laravel 5.0 以上兼容的套件,提供了無痛的 OAuth 認證。目前 Socialite 支持 Facebook、Twitter、Google 以及 GitHub。它寫起來可能像這樣:
public function redirectForAuth(){ return Socialize::with('twitter')->redirect();}public function getUserFromProvider(){ $user = Socialize::with('twitter')->user();}
不用再花上數(shù)小時撰寫 OAuth 的認證流程。數(shù)分鐘就可開始!查看完整文檔 里有所有的細節(jié)。
Laravel 現(xiàn)在包含了強大的 Flysystem(一個文件系統(tǒng)的抽象類庫),提供了無痛的集成,把本地端文件系統(tǒng)、Amazon S3 和 Rackspace 云存儲集成在一起, 有統(tǒng)一且優(yōu)雅的 API!現(xiàn)在要將文件存到 Amazon S3 相當簡單:
Storage::put('file.txt', 'contents');
更多關(guān)于 Laravel 文件系統(tǒng)集成,參考完整文檔。
Laravel 5.0 使用了 form requests,是繼承了 Illuminate\Foundation\Http\FormRequest
的類。這些 request 對象可以和控制器方法依賴注入結(jié)合,提供一個不需樣板的方法,可以驗證用戶輸入。讓我們深入點,看一個 FormRequest
的示例:
<?php namespace App\Http\Requests;class RegisterRequest extends FormRequest { public function rules() { return [ 'email' => 'required|email|unique:users', 'password' => 'required|confirmed|min:8', ]; } public function authorize() { return true; }}
定義好類后,我們可以在控制器動作里使用類型提示:
public function register(RegisterRequest $request){ var_dump($request->input());}
當 Laravel 的服務(wù)容器辨別出要注入的類別是個 FormRequest
實例,請求會被自動驗證。
意味著,當你的控制器動作被調(diào)用了,你可以安全的假設(shè) HTTP 的請求輸入己經(jīng)被驗證過,根據(jù)你在 form request
類別里自定的規(guī)則。甚至,若這個請求驗證不通過,一個 HTTP 重定向(可以自定),會自動發(fā)出,錯誤消息可以被閃存到 session 或是轉(zhuǎn)換成
JSON 返回。**表單驗證就是如此的簡單。**更多關(guān)于 FormRequest
驗證,參考文檔。
Laravel 5 基類控制器包含一個 ValidatesRequests
trait。這個 trait 包含了一個簡單的 validate
方法可以驗證請求。如果對應(yīng)用程序來說 FormRequests
太復(fù)雜了,參考這個:
public function createPost(Request $request){ $this->validate($request, [ 'title' => 'required|max:255', 'body' => 'required', ]);}
如果驗證失敗,會拋出異常并且返回對應(yīng)的 HTTP 回應(yīng)到瀏覽器。驗證錯誤信息會被閃存到 session!而如果請求是 AJAX 請求,Laravel 會自動返回 JSON 格式的驗證錯誤信息。
更多關(guān)于這個新方法的信息,參考這個文檔。
因采用了新的應(yīng)用程序默認架構(gòu),框架也添加了 Artisan generator 命令。使用 php artisan list
查看更多細節(jié)。
你現(xiàn)在可以在單一文件里緩存所有配置文件了,使用 config:cache
命令。
常用的 dd
輔助函數(shù),其可以在除錯時印出變量信息,已經(jīng)升級成使用令人驚艷的 Symfony VarDumper。它提供了顏色標記的輸出,甚至數(shù)組可以自動縮合。在項目中試試下列代碼:
dd([1, 2, 3]);
此發(fā)行版本的完整變更列表可以從一個 4.2 的完整安裝下,執(zhí)行 php artisan changes
命令,或者 Github 上的變更紀錄。此紀錄僅含括主要的強化更新和此發(fā)行的變更部分。
附注: 在 4.2 發(fā)布周期間,許多小的 bug 修正與功能強化被整并至各個 4.1 的子發(fā)行版本中。所以最好確認 Laravel 4.1 版本的更新列表。
Laravel 4.2 需要 PHP 5.4 以上的版本。此 PHP 更新版本讓我們可以使用 PHP 的新功能:traits 來為像是 Laravel 收銀臺 來提供更具表達力的接口。PHP 5.4 也比 PHP 5.3 帶來顯著的速度及性能提升。
Larvel Forge,一個網(wǎng)頁應(yīng)用程序,提供一個簡單的接口去建立管理你云端上的 PHP 服務(wù)器,像是 Linode、DigitalOcean、Rackspace 和 Amazon EC2。支持自動化 nginx 設(shè)置、SSH 密鑰管理、Cron job 自動化、透過 NewRelic & Papertrail 服務(wù)器監(jiān)控、「推送部署」、Laravel queue worker 設(shè)置等等。Forge 提供最簡單且更實惠的方式來部署所有你的 Laravel 應(yīng)用程序。
默認 Laravel 4.2 的安裝里,app/config/database.php
配置文件默認已為 Forge 設(shè)置完成,讓在平臺上的全新應(yīng)用程序更方便部署。
關(guān)于 Laravel Forge 的更多信息可以在官方 Forge 網(wǎng)站上找到。
Laravel Homestead 是一個為部署健全的 Laravel 和 PHP 應(yīng)用程序的官方 Vagrant
環(huán)境。絕大多數(shù)的封裝包的相依與軟件在發(fā)布前已經(jīng)部署處理完成,讓封裝包可以極快的被啟用。Homestead 包含 Nginx 1.6、PHP
5.5.12、MySQL、Postres、Redis、Memcached、Beanstalk、Node、Gulp、Grunt 和
Bower。Homestead 包含一個簡單的 Homestead.yaml
配置文件,讓你在單一個封裝包中管理多個 Laravel 應(yīng)用程序。
默認的 Laravel 4.2 安裝中包含的 app/config/local/database.php
配置文件使用 Homestead 的數(shù)據(jù)庫作為默認。讓 Laravel 初始化安裝與設(shè)置更為方便。
官方文檔已經(jīng)更新并包含在 Homestead 文檔 中。
Laravel 收銀臺是一個簡單、具表達性的資源庫,用來管理 Stripe 的訂閱帳務(wù)。雖然在安裝中此組件依然是選用,我們依然將收銀臺文檔包含在主要 Laravel 文檔中。此收銀臺發(fā)布版本帶來了數(shù)個錯誤修正、多貨幣支持還有支持最新的 Stripe API。
Artisan queue:work
命令現(xiàn)在支持 --daemon
參數(shù)讓 worker 可以以「常駐程序」啟用。代表 worker 可以持續(xù)的處理隊列工作不需要重啟框架。這讓一個復(fù)雜的應(yīng)用程序部署過程中,使得 CPU 的使用有顯著的降低。
更多關(guān)于 Queue Workers 常駐程序信息請詳閱 queue 文檔。
Laravel 4.2 為 Mail
函式采用了新的 Mailgun 和 Mandrill API 驅(qū)動。對許多應(yīng)用程序而言,他提供了比 SMTP 更快也更可靠的方法來遞送郵件。新的驅(qū)動使用了 Guzzle 4 HTTP 資源庫。
對于軟刪除和全作用域更簡潔的方案 PHP 5.4 的 traits
提供了一個更加簡潔的軟刪除架構(gòu)和全局作用域,這些新架構(gòu)為框架提供了更有擴展性的功能,并且讓框架更加簡潔。
更多關(guān)于軟刪除的文檔請見: Eloquent documentation.
得益于 PHP 5.4 traits,我們有了一個更簡潔的用戶認證和密碼提醒接口,這也讓 User
模型文檔更加精簡。
一個新的 simplePaginate
方法已被加入到查找以及 Eloquent 查找器中。讓你在分頁視圖中,使用簡單的「上一頁」和「下一頁」鏈接查找更為高效。
在正式環(huán)境中,破壞性的遷移動作將會被再次確認。如果希望取消提示字符確認請使用 --force
參數(shù)。
此發(fā)行版本的完整變更列表,可以在版本 4.1 的安裝中命令行執(zhí)行 php artisan changes
取得,或者瀏覽 Github 變更檔 中了解。其中只記錄了該版本比較主要的強化功能和變更。
一個全新的 SSH
組件在此發(fā)行版本中登場。此功能讓你可以輕易的 SSH 至遠程服務(wù)器并執(zhí)行命令。更多信息,可以參閱 SSH 組件文檔。
新的 php artisan tail
指令就是使用這個新的 SSH 組件。更多的信息,請參閱 tail
指令集文檔。
如果您的系統(tǒng)支持 Boris REPL,php artisan thinker
指令將會使用到它。系統(tǒng)中也必須先行安裝好 readline
和 pcntl
兩個 PHP 套件。如果你沒這些套件,從 4.0 之后將會使用到它。
Eloquent 添加了新的 hasManyThrough
關(guān)系鏈。想要了解更多,請參見 Eloquent 文檔。
一個新的 whereHas
方法也同時登場,他將允許檢索基于關(guān)系模型的約束。
Query Builder 和 Eloquent 目前透過數(shù)據(jù)庫層,已經(jīng)可以自動做到讀寫分離。更多的信息,請參考 文檔。
隊列排序已經(jīng)被支持,只要在 queue:listen
命令后將隊列以逗號分隔送出。
現(xiàn)在隊列將會自動處理失敗的作業(yè),只要在 queue:listen
后加上 --tries
即可。更多的失敗作業(yè)處理可以參見 隊列文檔。
緩存「區(qū)塊」已經(jīng)被「標簽」取代。緩存標簽允許你將多個「標簽」指向同一個緩存對象,而且可以清空所有被指定某個標簽的所有對象。更多使用緩存標簽信息請見 緩存文檔。
密碼提醒引擎已經(jīng)可以提供更強大的開發(fā)彈性,如:認證密碼、顯示狀態(tài)消息等等。使用強化的密碼提醒引擎,更多的信息 請參閱文檔。
Laravel 4.1 擁有一個完全重新編寫的路由層。API 一樣不變。然而與 4.0 相比,速度快上 100%。整個引擎大幅的簡化,且對于路由表達式的編譯大大減少對 Symfony Routing 的依賴。
此發(fā)行版本中,我們亦發(fā)布了全新的 Session 引擎。如同路由增進的部分,新的 Session 曾更加簡化且更快速。我們不再使用 Symfony 的 Session 處理工具,并且使用更簡單、更容易維護的客制化解法。
如果你有在你的遷移中使用到 renameColumn
,之后你必須在 composer.json
里加 doctrine/dbal
進相依套件中。此套件不再默認包含在 Laravel 之中。
更多建議: