Laravel 5.0 發(fā)布 新版本特性詳解
譯注: 期待 Laravel 5.0 已經(jīng)很久很久了, 之前跳票說要到今年一月份發(fā)布. 從一月份就一直在刷新官網(wǎng)和博客, 始終沒有更新的消息, 前幾天終于看到官網(wǎng)文檔切換到了 5.0 版. 新版本帶來了眾多令人激動的新特性, 尤其是定時任務(wù)隊(duì)列和表單請求兩個特性, 光看一下更新說明中的簡單介紹都忍不住要上手嘗試了. 今天總算抽出一點(diǎn)時間把官方的新特性說明文檔簡單地翻譯了一下, 希望所有喜歡 Laravel 框架的朋友都能感受到這個版本帶來的激動人心的改變. 當(dāng)然, 如果你需要的是 Phalcon 那樣的性能, 那它肯定不是你需要的. 如果你是因?yàn)樘摂M主機(jī)不支持 php 5.4 而不能享受 Laravel, 那你還不扔了你的虛擬主機(jī)??? 阿里云\騰訊云\linode... VPS的選擇不要太多...
Laravel 5.0
Laravel 5.0 引入了全新的項(xiàng)目目錄結(jié)構(gòu). 新的目錄結(jié)構(gòu)更有利于用 Laravel 來創(chuàng)建應(yīng)用. 5.0 版從頭到尾都采用了新的 PSR-4 自動加載標(biāo)準(zhǔn). 以下是 5.0 版主要的新特性:
目錄結(jié)構(gòu)
以前版本中的 app/models 目錄被整個移除. 如今你可以直接把代碼放在 app 目錄下, 該目錄下的所有代碼默認(rèn)會被組織到 app 命名空間. 這個命名空間是可以通過新增加的 Artisan 命令 app:name 來修改的.
Controllers, middleware 和 requests (Laravel 5.0 新增加的一種類) 被組織到 app/Http 目錄, 因?yàn)樗麄兌际桥c你應(yīng)用的 HTTP 傳輸層相關(guān)的類. 與之前把所有路由過濾器放到單一的 filters 文件下不同, 現(xiàn)在所有的 middleware (類似之前的 route filter) 被分別存放到各自自己的類文件中.
新版本中增加了一個 app/Providers 目錄來代替之前 4.x 版本的 app/start 文件. 這些 service providers 為應(yīng)用提供各種各樣的引導(dǎo)方法, 比如錯誤處理, 日志記錄, 路由加載等. 除此之外你當(dāng)然也可以創(chuàng)建額外的 service providers.
應(yīng)用的語言文件和視圖被移到了 resources 目錄.
Contracts
Laravel 的所有主要組件都實(shí)現(xiàn)了存放在 illuminate/contracts 倉庫中的接口. 該倉庫沒有額外的依賴項(xiàng). 擁有這樣一個方便的, 集中存放的接口集合, 你就可以很容易地通過它來對 Laravel Facades 進(jìn)行解耦和依賴注入方面的選擇和修改.
了解有關(guān) contracts 的更多信息, 可以查看它的完整文檔.
路由緩存
如果你的應(yīng)用由各種各樣的控制器路由 (controller routes) 組成, 你可以利用新增的 Artisan 命令 route:cache 大幅度提升路由的注冊速度. 這在路由數(shù)量超過 100 個的應(yīng)用中尤其有效, 可以 大幅度 提升整個應(yīng)用在路由部分的速度.
路由中間件 (Route Middleware)
在 4.0 版風(fēng)格的路由 "過濾器" 基礎(chǔ)上, 新版 5.0 已經(jīng)支持 HTTP 中間件, Laravel 自帶的 "authentication" 和 "filters" 已經(jīng)被轉(zhuǎn)換成中間件. 中間件為所有類型的過濾器提供了單一接口, 你可以很容易地對請求進(jìn)行審查和拒絕.
了解有關(guān)中間件的更多信息, 可以查看它的完整文檔.
控制器方法注入
除了現(xiàn)有的構(gòu)造器注入以外, 在新版本中還可以在控制器方法中的依賴項(xiàng)進(jìn)行類型約束. IoC container 會自動注入依賴項(xiàng), 即使在路由包含其它參數(shù)的時候也是.
public function createPost(Request $request, PostRepository $posts)
{
//
}
認(rèn)證腳手架
用戶注冊, 認(rèn)證以及密碼重置控制器已經(jīng)內(nèi)置在 5.0 版的網(wǎng)站框架中, 除了控制器以外, 還有簡單的視圖, 存放在 resources/views/auth 目錄. 除此之外, 網(wǎng)站初始框架中還包含了一個 "users" 表的 migration 文件. 這些簡單的資源幫助開發(fā)者不用在用戶認(rèn)證功能上耗費(fèi)大量時間. 認(rèn)證相關(guān)的頁面可以通過 auth/login 和 auth/register 這兩個路由訪問. App\Services\Auth\Registrar 服務(wù)負(fù)責(zé)處理創(chuàng)建和認(rèn)證用戶.
事件對象
在新版本中, 你可以把事件定義成對象而不是字符串. 看下面的例子:
class PodcastWasPurchased {
public $podcast;
public function __construct(Podcast $podcast)
{
$this->podcast = $podcast;
}
}
這個事件可以這樣調(diào)用:
Event::fire(new PodcastWasPurchased($podcast));
當(dāng)然, 你的事件處理程序收到的也不再是一個數(shù)據(jù)列表, 而是一個事件對象:
class ReportPodcastPurchase {
public function handle(PodcastWasPurchased $event)
{
//
}
}
了解有關(guān)事件的更多信息, 可以查看它的完整文檔.
命令/隊(duì)列
在 4.0 版支持的任務(wù)隊(duì)列基礎(chǔ)上, 5.0 支持把任務(wù)隊(duì)列定義為簡單的命令對象. 這些命令存放在 app/Commands 目錄. 下面是一個簡單的命令示例:
class PurchasePodcast extends Command implements SelfHandling, ShouldBeQueued {
use SerializesModels;
protected $user, $podcast;
/**
* 創(chuàng)建新的命令實(shí)例
*
* @return void
*/
public function __construct(User $user, Podcast $podcast)
{
$this->user = $user;
$this->podcast = $podcast;
}
/**
* 執(zhí)行命令
*
* @return void
*/
public function handle()
{
// 處理購買播客視頻的邏輯
event(new PodcastWasPurchased($this->user, $this->podcast));
}
}
Laravel 的基礎(chǔ)控制器 (base controller) 使用了新的 DispatchesCommands 特性, 允許你很方便地監(jiān)控命令的執(zhí)行:
$this->dispatch(new PurchasePodcastCommand($user, $podcast));
當(dāng)然, 你不僅可以把命令用于任務(wù)隊(duì)列(非同步執(zhí)行), 也可以用于同步任務(wù). 事實(shí)上, 把你的應(yīng)用需要執(zhí)行的復(fù)雜任務(wù)封裝成命令是一個很好的選擇. 了解有關(guān)命令的更多信息, 可以查看命令橋的詳細(xì)文檔.
數(shù)據(jù)庫隊(duì)列
新版 Laravel 包含 database 隊(duì)列驅(qū)動, 提供簡單的, 本地的隊(duì)列驅(qū)動, 無需安裝額外的包. (譯注:比如讓不支持事務(wù)的數(shù)據(jù)庫進(jìn)行類似事務(wù)的數(shù)據(jù)操作)
Laravel 定時任務(wù)
在過去, 為了定時執(zhí)行控制臺任務(wù), 開發(fā)者必須依賴 Cron 任務(wù). 這帶來很大不便. 因?yàn)槎〞r任務(wù)并不包括在網(wǎng)站的源代碼中, 而且必須通過 SSH 登陸到服務(wù)器去添加 Cron 任務(wù). 新版 Laravel 的定時任務(wù)允許開發(fā)者在 Laravel 框架內(nèi)來定義定時執(zhí)行的命令, 然后只需要在服務(wù)器上定義一個總的 Cron 任務(wù)即可.
比如:
$schedule->command('artisan:command')->dailyAt('15:00');
同樣的, 了解更多有關(guān)定時任務(wù)的信息, 可以查閱完整文檔.
Tinker / Psysh
php artisan tinker 命令在新版本中借助了 Justin Heleman 開發(fā)的 Psysh. 如果你喜歡 Laravel 4.0 里的 Boris, 你肯定會喜歡 Psysh. Boris 在 Windows 下運(yùn)行得不好, Psysh 完全支持 Windows! 使用方法和以前一樣:
php artisan tinker
DotEnv
在 Laravel 5.0 中, 用 Vance Lucas 實(shí)現(xiàn)的 DotEnv 替代了以前版本中的嵌套結(jié)構(gòu), 容易讓人困惑的環(huán)境配置目錄. 這個框架提供了一種非常簡單的管理環(huán)境配置的方式. 在 Laravel 5.0 中檢測和區(qū)分不同的運(yùn)行環(huán)境變得輕而易舉. 了解更多詳情, 請?jiān)L問完整的配置文檔.
Laravel Elixir
由 Jeffrey Way 提供的 Laravel Elixir 提供了簡明易懂的合并, 編譯資源文件的接口. 如果你曾經(jīng)對配置 Grunt 或者 Gulp 感到很頭大, 那么現(xiàn)在你得到解放了. Elixir 讓你可以輕松地借助 Gulp 來編譯你的 Less, Sass 和 CoffeeScript 文件. 它甚至可以替你執(zhí)行測試.
了解 Elixir 的更多詳情, 請?jiān)L問完整文檔.
Laravel Socialite
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();
}
所以你不用再耗費(fèi)大量的時間來編寫 OAuth 認(rèn)證流程, 分分鐘輕松搞定. 完整文檔 包含有關(guān)這個可選包的全部細(xì)節(jié).
Flysystem 集成
新版 Laravel 還包含了強(qiáng)大的 Flysystem 文件處理靜態(tài)庫. 通過這個庫, 開發(fā)者可以輕易上手, 使用完全一致的 API 來實(shí)現(xiàn)本地, Amazon S3 或者 Rackspace 進(jìn)行文件存儲. 比如, 在 Amazon S3 存儲一個文件, 可以簡單到這樣:
Storage::put('file.txt', 'contents');
了解有關(guān) Laravel Flysystem 集成的更多細(xì)節(jié), 可以查看它的完整文檔
表單請求
Laravel 5.0 帶來了全新的 form requests, 它擴(kuò)展自 Illuminate\Foundation\Http\FormRequest 類. 這些請求對象可以和控制器方法注入相結(jié)合, 提供一種全新的驗(yàn)證用戶輸入的方法. 簡單舉一個 FormRequest 的示例:
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;
}
}
定義好對應(yīng)的 FormRequest 擴(kuò)展類之后, 在控制器方法中可以獲得類型提示:
public function register(RegisterRequest $request)
{
var_dump($request->input());
}
當(dāng) Laravel 的 IoC container 識別到方法變量的類型時, 它會自動注入 FormRequest 的實(shí)例, 于是這個請求會被 自動驗(yàn)證. 這意味著當(dāng)你的控制器被調(diào)用時, 你可以安全地使用該請求中包含的輸入數(shù)據(jù), 因?yàn)樗麄円呀?jīng)被你在表單請求類中指定的規(guī)則進(jìn)行過驗(yàn)證了. 不僅如此, 如果該請求驗(yàn)證失敗, 系統(tǒng)還會自動重定向到你預(yù)定義好的路由, 并且包含有錯誤提示的信息(根據(jù)需要寫入session, 或者轉(zhuǎn)換為 JSON 格式.) 表單驗(yàn)證從未如此簡單過. 了解有關(guān) FormRequest 驗(yàn)證的更多細(xì)節(jié), 請查閱文檔.
控制器請求簡單驗(yàn)證
Laravel 5.0 的控制器基類還包含了一個 ValidatesRequests 的 trait. 該 trait 提供了簡單的 validate 方法, 用于驗(yàn)證請求. 如果 FormRequests 對于你的應(yīng)用來說太重了, 那你就可以用這個輕量版的:
public function createPost(Request $request)
{
$this->validate($request, [
'title' => 'required|max:255',
'body' => 'required',
]);
}
如果驗(yàn)證失敗, 系統(tǒng)會拋出一個異常, 對應(yīng)的 HTTP 請求會被自動發(fā)送給瀏覽器. 驗(yàn)證錯誤也會同時寫入 session. 如果請求是用 AJAX 方式發(fā)起, Larave 會自動發(fā)送一個 JSON 形式的驗(yàn)證錯誤信息.
了解有關(guān) FormRequest 驗(yàn)證的更多細(xì)節(jié), 請查閱文檔.
全新的生成器
為了方便生成新的默認(rèn)應(yīng)用結(jié)構(gòu), 全新的 Artisan 生成命令已經(jīng)被添加到框架中. 你可以通過 php artisan list 查看詳細(xì)命令.
配置緩存
通過 config:cache 命令, 可以把所有的配置項(xiàng)寫入一個緩存文件中.
Symfony VarDumper
用于輸出變量信息進(jìn)行調(diào)試的輔助方法 dd, 在新版本中進(jìn)行了升級, 使用強(qiáng)大的 Symfony VarDumper. 它可以輸出帶有顏色高亮和數(shù)組折疊功能的調(diào)試信息. 你可以嘗試一下:
dd([1, 2, 3]);
- Laravel 5框架學(xué)習(xí)之Eloquent 關(guān)系
- Laravel 5框架學(xué)習(xí)之Eloquent (laravel 的ORM)
- Laravel模板引擎Blade中section的一些標(biāo)簽的區(qū)別介紹
- Laravel實(shí)現(xiàn)用戶注冊和登錄
- 推薦幾款用 Sublime Text 開發(fā) Laravel 所用到的插件
- 跟我學(xué)Laravel之視圖 & Response
- 跟我學(xué)Laravel之安裝Laravel
- 跟我學(xué)Laravel之快速入門
- Laravel框架表單驗(yàn)證詳解
- Laravel框架中擴(kuò)展函數(shù)、擴(kuò)展自定義類的方法
- Laravel框架路由配置總結(jié)、設(shè)置技巧大全
- PHP開發(fā)框架Laravel數(shù)據(jù)庫操作方法總結(jié)
- 詳解PHP的Laravel框架中Eloquent對象關(guān)系映射使用
相關(guān)文章
php SQLite學(xué)習(xí)筆記與常見問題分析
php SQLite學(xué)習(xí)資料收集,與一些常見問題的解決方法2008-07-07PHP CodeBase:將時間顯示為"剛剛""n分鐘/小時前"的方法詳解
本篇文章是對PHP CodeBase:將時間顯示為"剛剛""n分鐘/小時前"的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06C# WinForm中實(shí)現(xiàn)快捷鍵自定義設(shè)置實(shí)例
這篇文章主要介紹了對C# WinForm中實(shí)現(xiàn)快捷鍵自定義設(shè)置實(shí)例,本文實(shí)現(xiàn)了大多數(shù)軟件如QQ、有道詞典中的快捷鍵設(shè)置功能,即按下相應(yīng)按鍵后顯示在文本框中,需要的朋友可以參考下2015-01-01PHP學(xué)習(xí)筆記之三 數(shù)據(jù)庫基本操作
本文介紹最基本最實(shí)用的數(shù)據(jù)庫操作。首先簡單復(fù)習(xí)下MySQL的使用方法,并且建好一張表備用。MySQL在Linux系統(tǒng)上一般都是裝好的,在win下安裝也很簡單,不多做介紹。2011-01-01