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

