Laravel 5.0 釋出, 海量新特性!!
Laravel 5.0
Laravel 5.0 引入了全新的專案目錄結構. 新的目錄結構更有利於用 Laravel 來建立應用. 5.0 版從頭到尾都採用了新的 PSR-4 自動載入標準. 以下是 5.0 版主要的新特性:
目錄結構
以前版本中的 app/models
目錄被整個移除. 如今你可以直接把程式碼放在 app
目錄下, 該目錄下的所有程式碼預設會被組織到 app
名稱空間. 這個名稱空間是可以通過新增加的 Artisan 命令 app:name
來修改的.
Controllers, middleware 和 requests (Laravel 5.0 新增加的一種類) 被組織到 app/Http
新版本中增加了一個 app/Providers
目錄來代替之前 4.x 版本的 app/start
檔案. 這些 service providers 為應用提供各種各樣的引導方法, 比如錯誤處理, 日誌記錄, 路由載入等. 除此之外你當然也可以建立額外的 service providers.
應用的語言檔案和檢視被移到了 resources
目錄.
Contracts
Laravel 的所有主要元件都實現了存放在 illuminate/contracts
倉庫中的介面. 該倉庫沒有額外的依賴項. 擁有這樣一個方便的, 集中存放的介面集合, 你就可以很容易地通過它來對 Laravel Facades 進行解耦和依賴注入方面的選擇和修改.
瞭解有關 contracts 的更多資訊, 可以檢視它的完整文件.
路由快取
如果你的應用由各種各樣的控制器路由 (controller routes) 組成, 你可以利用新增的 Artisan 命令 route:cache
大幅度提升路由的註冊速度. 這在路由數量超過 100 個的應用中尤其有效, 可以 大幅度 提升整個應用在路由部分的速度.
路由中介軟體 (Route Middleware)
在 4.0 版風格的路由 "過濾器" 基礎上, 新版 5.0 已經支援 HTTP 中介軟體, Laravel 自帶的 "authentication" 和 "filters" 已經被轉換成中介軟體. 中介軟體為所有型別的過濾器提供了單一介面, 你可以很容易地對請求進行審查和拒絕.
瞭解有關中介軟體的更多資訊, 可以檢視它的完整文件.
控制器方法注入
除了現有的構造器注入以外, 在新版本中還可以在控制器方法中的依賴項進行型別約束. IoC container 會自動注入依賴項, 即使在路由包含其它引數的時候也是.
public function createPost(Request $request, PostRepository $posts)
{
//
}
認證腳手架
使用者註冊, 認證以及密碼重置控制器已經內建在 5.0 版的網站框架中, 除了控制器以外, 還有簡單的檢視, 存放在 resources/views/auth
目錄. 除此之外, 網站初始框架中還包含了一個 "users" 表的 migration 檔案. 這些簡單的資源幫助開發者不用在使用者認證功能上耗費大量時間. 認證相關的頁面可以通過 auth/login
和 auth/register
這兩個路由訪問. AppServicesAuthRegistrar
服務負責處理建立和認證使用者.
事件物件
在新版本中, 你可以把事件定義成物件而不是字串. 看下面的例子:
class PodcastWasPurchased {
public $podcast;
public function __construct(Podcast $podcast)
{
$this->podcast = $podcast;
}
}
這個事件可以這樣呼叫:
Event::fire(new PodcastWasPurchased($podcast));
當然, 你的事件處理程式收到的也不再是一個數據列表, 而是一個事件物件:
class ReportPodcastPurchase {
public function handle(PodcastWasPurchased $event)
{
//
}
}
瞭解有關事件的更多資訊, 可以檢視它的完整文件.
命令/佇列
在 4.0 版支援的任務佇列基礎上, 5.0 支援把任務佇列定義為簡單的命令物件. 這些命令存放在 app/Commands
目錄. 下面是一個簡單的命令示例:
class PurchasePodcast extends Command implements SelfHandling, ShouldBeQueued {
use SerializesModels;
protected $user, $podcast;
/**
* 建立新的命令例項
*
* @return void
*/
public function __construct(User $user, Podcast $podcast)
{
$this->user = $user;
$this->podcast = $podcast;
}
/**
* 執行命令
*
* @return void
*/
public function handle()
{
// 處理購買播客視訊的邏輯
event(new PodcastWasPurchased($this->user, $this->podcast));
}
}
Laravel 的基礎控制器 (base controller) 使用了新的 DispatchesCommands
特性, 允許你很方便地監控命令的執行:
$this->dispatch(new PurchasePodcastCommand($user, $podcast));
當然, 你不僅可以把命令用於任務佇列(非同步執行), 也可以用於同步任務. 事實上, 把你的應用需要執行的複雜任務封裝成命令是一個很好的選擇. 瞭解有關命令的更多資訊, 可以檢視命令橋的詳細文件.
資料庫佇列
新版 Laravel 包含 database
佇列驅動, 提供簡單的, 本地的佇列驅動, 無需安裝額外的包. (譯註:比如讓不支援事務的資料庫進行類似事務的資料操作)
Laravel 定時任務
在過去, 為了定時執行控制檯任務, 開發者必須依賴 Cron 任務. 這帶來很大不便. 因為定時任務並不包括在網站的原始碼中, 而且必須通過 SSH 登陸到伺服器去新增 Cron 任務. 新版 Laravel 的定時任務允許開發者在 Laravel 框架內來定義定時執行的命令, 然後只需要在伺服器上定義一個總的 Cron 任務即可.
比如:
$schedule->command('artisan:command')->dailyAt('15:00');
同樣的, 瞭解更多有關定時任務的資訊, 可以查閱完整文件.
Tinker / Psysh
php artisan tinker
命令在新版本中藉助了 Justin Heleman 開發的 Psysh. 如果你喜歡 Laravel 4.0 裡的 Boris, 你肯定會喜歡 Psysh. Boris 在 Windows 下執行得不好, Psysh 完全支援 Windows! 使用方法和以前一樣:
php artisan tinker
DotEnv
在 Laravel 5.0 中, 用 Vance Lucas 實現的 DotEnv 替代了以前版本中的巢狀結構, 容易讓人困惑的環境配置目錄. 這個框架提供了一種非常簡單的管理環境配置的方式. 在 Laravel 5.0 中檢測和區分不同的執行環境變得輕而易舉. 瞭解更多詳情, 請訪問完整的配置文件.
Laravel Elixir
由 Jeffrey Way 提供的 Laravel Elixir 提供了簡明易懂的合併, 編譯資原始檔的介面. 如果你曾經對配置 Grunt 或者 Gulp 感到很頭大, 那麼現在你得到解放了. Elixir 讓你可以輕鬆地藉助 Gulp 來編譯你的 Less, Sass 和 CoffeeScript 檔案. 它甚至可以替你執行測試.
瞭解 Elixir 的更多詳情, 請訪問完整文件.
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();
}
所以你不用再耗費大量的時間來編寫 OAuth 認證流程, 分分鐘輕鬆搞定. 完整文件 包含有關這個可選包的全部細節.
Flysystem 整合
新版 Laravel 還包含了強大的 Flysystem 檔案處理靜態庫. 通過這個庫, 開發者可以輕易上手, 使用完全一致的 API 來實現本地, Amazon S3 或者 Rackspace 進行檔案儲存. 比如, 在 Amazon S3 儲存一個檔案, 可以簡單到這樣:
Storage::put('file.txt', 'contents');
瞭解有關 Laravel Flysystem 整合的更多細節, 可以檢視它的完整文件
表單請求
Laravel 5.0 帶來了全新的 form requests, 它擴充套件自 IlluminateFoundationHttpFormRequest
類. 這些請求物件可以和控制器方法注入相結合, 提供一種全新的驗證使用者輸入的方法. 簡單舉一個 FormRequest
的示例:
namespace AppHttpRequests;
class RegisterRequest extends FormRequest {
public function rules()
{
return [
'email' => 'required|email|unique:users',
'password' => 'required|confirmed|min:8',
];
}
public function authorize()
{
return true;
}
}
定義好對應的 FormRequest
擴充套件類之後, 在控制器方法中可以獲得型別提示:
public function register(RegisterRequest $request)
{
var_dump($request->input());
}
當 Laravel 的 IoC container 識別到方法變數的型別時, 它會自動注入 FormRequest
的例項, 於是這個請求會被 自動驗證. 這意味著當你的控制器被呼叫時, 你可以安全地使用該請求中包含的輸入資料, 因為他們已經被你在表單請求類中指定的規則進行過驗證了. 不僅如此, 如果該請求驗證失敗, 系統還會自動重定向到你預定義好的路由, 並且包含有錯誤提示的資訊(根據需要寫入session, 或者轉換為 JSON 格式.) 表單驗證從未如此簡單過. 瞭解有關 FormRequest
驗證的更多細節, 請查閱文件.
控制器請求簡單驗證
Laravel 5.0 的控制器基類還包含了一個 ValidatesRequests
的 trait. 該 trait 提供了簡單的 validate
方法, 用於驗證請求. 如果 FormRequests
對於你的應用來說太重了, 那你就可以用這個輕量版的:
public function createPost(Request $request)
{
$this->validate($request, [
'title' => 'required|max:255',
'body' => 'required',
]);
}
如果驗證失敗, 系統會丟擲一個異常, 對應的 HTTP 請求會被自動傳送給瀏覽器. 驗證錯誤也會同時寫入 session. 如果請求是用 AJAX 方式發起, Larave 會自動傳送一個 JSON 形式的驗證錯誤資訊.
瞭解有關 FormRequest
驗證的更多細節, 請查閱文件.
全新的生成器
為了方便生成新的預設應用結構, 全新的 Artisan 生成命令已經被新增到框架中. 你可以通過 php artisan list
檢視詳細命令.
配置快取
通過 config:cache
命令, 可以把所有的配置項寫入一個快取檔案中.
Symfony VarDumper
用於輸出變數資訊進行除錯的輔助方法 dd
, 在新版本中進行了升級, 使用強大的 Symfony VarDumper. 它可以輸出帶有顏色高亮和陣列摺疊功能的除錯資訊. 你可以嘗試一下:
dd([1, 2, 3]);