1. 程式人生 > 其它 >Laravel 5.0 釋出, 海量新特性!!

Laravel 5.0 釋出, 海量新特性!!

譯註: 期待 Laravel 5.0 已經很久很久了, 之前跳票說要到今年一月份釋出. 從一月份就一直在重新整理官網和部落格, 始終沒有更新的訊息, 前幾天終於看到官網文件切換到了 5.0 版. 新版本帶來了眾多令人激動的新特性, 尤其是定時任務佇列表單請求兩個特性, 光看一下更新說明中的簡單介紹都忍不住要上手嘗試了. 今天總算抽出一點時間把官方的新特性說明文件簡單地翻譯了一下, 希望所有喜歡 Laravel 框架的朋友都能感受到這個版本帶來的激動人心的改變. 當然, 如果你需要的是 Phalcon 那樣的效能, 那它肯定不是你需要的. 如果你是因為虛擬主機不支援 php 5.4 而不能享受 Laravel, 那你還不扔了你的虛擬主機???騰訊雲linode... VPS的選擇不要太多...

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

目錄, 因為他們都是與你應用的 HTTP 傳輸層相關的類. 與之前把所有路由過濾器放到單一的 filters 檔案下不同, 現在所有的 middleware (類似之前的 route filter) 被分別存放到各自自己的類檔案中.

新版本中增加了一個 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/loginauth/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]);