* * * * *
[TOC]
## 支持策略
對于 LTS 版本,比如 Laravel 5.1,會提供為期兩年的 bug 修復和三年的安全修復支持。LTS 版本是 Laravel 能提供的維護時間最長的發行版。
對于其他通用版本,只提供六個月的 bug 修復和一年的安全修復支持。
> [Laravel 的發布路線圖](https://phphub.org/topics/2594)?- by?[Summer](http://github.com/summerblue)
## Laravel 5.4.22
Laravel 5.4.22 為 Laravel 5.4 系列版本中能對應用程序中的用戶進行網絡釣魚的安全漏洞安裝了補丁。使用密碼重置系統,惡意用戶可以嘗試欺騙你的用戶將登錄憑據輸入到他們控制的單獨應用程序中。由于密碼重置通知使用主機傳入請求來獲取重置密碼的 URL,因此用來生成重置密碼的 URL 的主機可能會被欺騙。如果用戶沒有注意到他們訪問的域名不正確,他們可能會意外將自己的登錄憑據輸入到惡意的應用程序中。
在 Laravel 5.1 的應用程序中,密碼重置通知由開發人員維護,因此此漏洞可能存在或可能不存在。你應該驗證應用程序生成密碼重置的鏈接是否是絕對的 URL:
~~~
{{ url('http://example.com/password/reset/'.$token) }}
~~~
## Laravel 5.4
Laravel 5.4 繼續在 Laravel 5.3 的基礎上進行優化,新特性包括以下:
* [在郵件和通知中支持 Markdown](郵件發送.md#Markdown__Mailables__322);
* [Laravel Dusk 瀏覽器自動測試框架](瀏覽器測試Dusk.md);
* Laravel Mix;
* Blade "components" 和 "slots";
* 在廣播頻道上進行路由模型綁定;
* 在集合中支持高階消息傳遞;
* 基于對象的 Eloquent 事件;
* 任務級別的「重試」和「超時」設置;
* "實時" Facades;
* 更好的支持 Redis Cluster;
* 自定義 pivot 表模型;
* 兩個新的中間件,用于輸入修剪空格和清除非必要字段,等等。
此外,還對整個框架代碼進行了 reviewed 和重構,以使代碼更加干凈和清晰。
> {tip} 這個文檔總結了許多框架值得注意的改進。需要知道更多細節請參考 Github 上的更新記錄?[on GitHub](https://github.com/laravel/framework/blob/5.4/CHANGELOG-5.4.md)。
### Markdown 郵件和通知
> {video} Laracasts 上關于此新特性的免費視頻?[video tutorial](https://laracasts.com/series/whats-new-in-laravel-5-4/episodes/7)。
此新特性允許我們在郵件通知中使用 Markdown 語法,Laravel 可以將這些消息渲染成美觀、響應式的 HTML 模板,同時自動生成純文本副本,下面是一個 Markdown 格式的郵件示例:
~~~
@component('mail::message')
# Order Shipped
Your order has been shipped!
@component('mail::button', ['url' => $url])
View Order
@endcomponent
Next Steps:
- Track Your Order On Our Website
- Pre-Sign For Delivery
Thanks,<br>
{{ config('app.name') }}
@endcomponent
~~~
利用這個簡單的 Markdown 模板,Laravel 可以生成一個響應式 HTML 郵件和純文本副本:
[](https://laravel.com/assets/img/examples/markdown.png)
[](https://laravel.com/assets/img/examples/markdown.png)
要想了解更多細節,查看?[mail](郵件發送.md)?和?[notification](消息通知.md)?文檔。
> {tip} 你可以導出所有的 Markdown 郵件組件到自己的應用中進行自定義。使用?`vendor:publish`?Artisan 命令?`laravel-mail`?選項來導出資源。
### Laravel Dusk
> {video} Laracasts 上關于此新特性的免費視頻?[video tutorial](https://laracasts.com/series/whats-new-in-laravel-5-4/episodes/9)。
Laravel Dusk 提供一個優雅,簡單易用的瀏覽器自動化測試 API。默認情況下,Dusk 不需要再你安裝 JDK 或 Selenium 。Dusk 使用獨立的?[ChromeDriver](https://sites.google.com/a/chromium.org/chromedriver/home)?安裝方式。你也可自由的使用其他 Selenium 兼容驅動。
Dusk 運行使用真實的瀏覽器,所有你可以輕松地對那些重度使用 JavaScript 的引用進行測試和交互:
~~~
/**
* 一個基本瀏覽器測試例子.
*
* @return void
*/
public function testBasicExample()
{
$user = factory(User::class)->create([
'email' => 'taylor@laravel.com',
]);
$this->browse(function ($browser) use ($user) {
$browser->loginAs($user)
->visit('/home')
->press('Create Playlist')
->whenAvailable('.playlist-modal', function ($modal) {
$modal->type('name', 'My Playlist')
->press('Create');
});
$browser->waitForText('Playlist Created');
});
}
~~~
需要了解更多關于 Dusk 的細節,查看?[Dusk 文檔](瀏覽器測試Dusk.md)
### Laravel Mix
> {video} Laracasts 上關于此新特性的免費視頻?[video tutorial](https://laracasts.com/series/whats-new-in-laravel-5-4/episodes/3)。
Laravel Mix 是 Laravel Elixir 思想繼承者,完全基于 Webpack 而非 Gulp。Laravel Mix 提供流式 API 定義 Webpack 構建步驟,有幾種已經定義的 CSS 和 JavaScript 預處理器。通過簡單的方法鏈,你可以流暢的定義你的資源構建流水線。例如:
~~~
mix.js('resources/assets/js/app.js', 'public/js')
.sass('resources/assets/sass/app.scss', 'public/css');
~~~
### Blade Components & Slots
> {video} Laracasts 上關于此新特性的免費視頻?[video tutorial](https://laracasts.com/series/whats-new-in-laravel-5-4/episodes/6)。
Blade components 和 slots 提供與 sections 和 layouts 相似的功能;然而,有些人會覺得 components 和 slots 的思想更易理解。首先,讓我們假設一個可重用的 "alert" 組件想要在整個應用進行重用:
~~~
<!-- /resources/views/alert.blade.php -->
<div class="alert alert-danger">
{{ $slot }}
</div>
~~~
`{{ $slot }}`?變量包含我們想要插入的組件內容,要構建這個組件,我們可以使用?`component`?Blade 指令:
~~~
@component('alert')
<strong>Whoops!</strong> Something went wrong!
@endcomponent
~~~
命名 slots 允許在單個組件中定義多個 slots:
~~~
<!-- /resources/views/alert.blade.php -->
<div class="alert alert-danger">
<div class="alert-title">{{ $title }}</div>
{{ $slot }}
</div>
~~~
命名 slots 可以通過?`@slot`?指令注入。一個?`@slot`?中的所有內容都會被傳遞給?`@slot`?變量:
~~~
@component('alert')
@slot('title')
Forbidden
@endslot
You are not allowed to access this resource!
@endcomponent
~~~
需要了解更多關于 components 和 slots 的細節,查看?[Blade documentation](Blade模板.md)。
### 廣播模型綁定
和 HTTP 路由一樣,頻道路由也使用隱式和顯式?[路由模型綁定](路由.md#_231)。例如,可以通過請求一個實際的?`Order`?模型實例來取代之前獲取字符串或數字訂單ID ID:
~~~
use App\Order;
Broadcast::channel('order.{order}', function ($user, Order $order) {
return $user->id === $order->user_id;
});
~~~
需要了解更多關于廣播模型綁定,查看?[事件廣播](廣播系統.md)。
### 集合高階消息傳遞
> {video} Laracasts 上關于此新特性的免費視頻?[video tutorial](https://laracasts.com/series/whats-new-in-laravel-5-4/episodes/2)。
集合現在支持 "高階消息傳遞",從而使集合的操作更為精簡,目前支持高階消息傳遞方法有:
`contains`、`each`、`every`、`filter`、`first`、`map`、`partition`、`reject`、`sortBy`、`sortByDesc`、?`sum`。
每一個高階消息傳遞都可以通過集合實例的動態屬性進行訪問,例如,使用?`each`?的高階消息傳遞去調用集合的某個對象:
~~~
$users = User::where('votes', '>', 500)->get();
$users->each->markAsVip();
~~~
類似的,我們可以通過?`sum`?的高階消息傳遞在用戶集合中聚合所有的投票數:
~~~
$users = User::where('group', 'Development')->get();
return $users->sum->votes;
~~~
### 基于對象的 Eloquent 事件
> {video} Laracasts 上關于此新特性的免費視頻?[video tutorial](https://laracasts.com/series/whats-new-in-laravel-5-4/episodes/10)。
Eloquent 事件處理器現在可以被映射到事件對象上。這提供了一種直觀處理 Eloquent 事件并易于測試的方式。在開始使用之前,先在你的 Eloquent 模型中定義一個?`$events`?屬性數組,在這個數組中可以定義 Eloquent 模型的生命周期中屬于你的?[事件 classes](事件系統.md):
~~~
<?php
namespace App;
use App\Events\UserSaved;
use App\Events\UserDeleted;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use Notifiable;
/**
* The event map for the model.
*
* @var array
*/
protected $events = [
'saved' => UserSaved::class,
'deleted' => UserDeleted::class,
];
}
~~~
### 任務級別重試和超時
5.4版本以前,任務隊列 "retry" 和 "timeout" 設置只能在全局的隊列配置中用命令行設置。現在可以單獨在任務類中配置每一個任務的 "重試" 和 "超時":
~~~
<?php
namespace App\Jobs;
class ProcessPodcast implements ShouldQueue
{
/**
* The number of times the job may be attempted.
*
* @var int
*/
public $tries = 5;
/**
* The number of seconds the job can run before timing out.
*
* @var int
*/
public $timeout = 120;
}
~~~
需要了更多,查看?[隊列](隊列.md).
### 請求清理中間件
> {video} Laracasts 上關于此新特性的免費視頻?[video tutorial](https://laracasts.com/series/whats-new-in-laravel-5-4/episodes/1)。
Laravel 5.4 在默認的中間件棧中引入了兩個新的中間件:`TrimStrings`?和?`ConvertEmptyStringsToNull`:
~~~
/**
* 應用的全局 HTTP 中間件棧
*
* 這些中間件會對你的每一個請求運行
*
* @var array
*/
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];
~~~
新增的中間件會自動去除請求輸入值首尾的空格、將空字符串轉換為?`null`。這可以幫助你獲得正確的輸入而不需要重復在每一個路由和控制器中調用?`trim`?方法。
### "實時" Facades
> {video} Laracasts 上關于此新特性的免費視頻?[video tutorial](https://laracasts.com/series/whats-new-in-laravel-5-4/episodes/8)。
5.4版本以前,只有 Laravel 內置的服務才可以提供?[Facades](Facades.md),提供快速的,簡短的方式訪問這些服務容器的方法。在 Laravel 5.4 中,你可以輕松的將你的任意類庫實時的轉換成Facades,只需要將類名導入到?`Facades`?中。例如,假設你的應用中有這樣一個類:
~~~
<?php
namespace App\Services;
class PaymentGateway
{
protected $tax;
/**
* 創建一個新的支付網關實例
*
* @param TaxCalculator $tax
* @return void
*/
public function __construct(TaxCalculator $tax)
{
$this->tax = $tax;
}
/**
* Pay the given amount.
*
* @param int $amount
* @return void
*/
public function pay($amount)
{
// Pay an amount...
}
}
~~~
你可以這樣以 Facades 的方式調用這個類的方法:
~~~
use Facades\ {
App\Services\PaymentGateway
};
Route::get('/pay/{amount}', function ($amount) {
PaymentGateway::pay($amount);
});
~~~
當然,如果你以這種方式實現實時 Facades ,就可以使用 Laravel 的?[Facades 模擬功能](測試模擬器.md)?編寫測試用例:
~~~
PaymentGateway::shouldReceive('pay')->with('100');
~~~
### 自定義 Pivot 表模型
在 Laravel 5.3, 所有的?`belongsToMany`?關聯關系使用同一個內置的?`Pivot`?模型實例。在 Laravel 5.4 中你可以為這些 pivot 表自定義模型類,如果你想要定義一個自定義模型,可以在定義關聯關系時使用?`using`?方法:
~~~
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Role extends Model
{
/**
* 屬于這個角色的用戶
*/
public function users()
{
return $this->belongsToMany('App\User')->using('App\UserRole');
}
}
~~~
### 優化 Redis 集群支持
5.4版本以前,在同一個應用中不能同時定義 Redis 鏈接指向單個主機和集群,在 Laravel 5.4 中可以在同一個應用中定義 Redis 鏈接指向多個主機和多個集群。
更多關于 Laravel 中 Redis 的信息,查看?[Redis 文檔](Redis.md)。
### 遷移默認字符長度
Laravel 5.4 默認使用?`utf8mb4`?字符編碼,該編碼支持對 "emojis" 表情在數據庫進行存儲。如果你從 Laravel 5.3 升級,不需要對字符編碼做切換。
如果你選擇手動切換到這個字符編碼,并且運行小于 MySQL 5.7.7 release 版本的數據庫,你可能還需要手動配置遷移命令生成默認字符長度,你可以在?`AppServiceProvider`?中調用?`Schema::defaultStringLength`?方法來實現這一配置:
~~~
use Illuminate\Support\Facades\Schema;
/**
* 引導任何應用服務
*
* @return void
*/
public function boot()
{
Schema::defaultStringLength(191);
}
~~~
## Laravel 5.3
Laravel 5.3 在 5.2 基礎上進行了優化,新特性包括以下:
* [消息通知 Laravel Notifications](https://laravel-china.org/docs/laravel/5.3/notifications);
* [事件廣播 Laravel Echo](https://laravel-china.org/docs/laravel/5.3/broadcasting);
* [OAuth2 授權認證 Laravel Passport](https://laravel-china.org/docs/laravel/5.3/passport);
* [全文搜索引擎 Laravel Scout](https://laravel-china.org/docs/laravel/5.3/scout);
* Laravel Elixir 開始支持 Webpack;
* Mail 操作類 Laravel Mailable;
* `web`?和?`api`?的路由分離;
* 基于閉包的控制臺命令;
* 更加易用的輔助函數,用于存儲上傳的文件;
* 支持 POPO 和單動作控制;
* 優化默認的前端腳手架,等等。
### 消息通知
> {video} Laracasts 上關于此新特性的免費視頻?[video tutorial](https://laracasts.com/series/whats-new-in-laravel-5-3/episodes/9)。
Laravel Notifications 提供了簡單、優雅的 API 支持你通過不同的渠道發送通知,例如電子郵件、Slack、手機短信等等。
例如,你可以定義一個單據,當該單據被付款后,則通過郵件和手機短信發送提醒通知:
你可用通過下面這個簡單的方法來實現:
~~~
$user->notify(new InvoicePaid($invoice));
~~~
[Laravel 社區](http://laravel-notification-channels.com/)?已經為通知系統編寫了各式的驅動,甚至包括對 iOS 和 Android 通知的支持,更多關于通知系統的信息,請查看?[完整的文檔](https://laravel-china.org/docs/laravel/5.3/notifications)。
### WebSockets / 事件廣播
事件廣播在之前版本的 Laravel 中已經存在,Laravel 5.3 現支持對私有和已存在的 WebSocket 頻道添加頻道級認證:
~~~
/*
* 頻道認證
*/
Broadcast::channel('orders.*', function ($user, $orderId) {
return $user->placedOrder($orderId);
});
~~~
Laravel Echo 是一個可通過 NPM 安裝的全新的 JavaScript 包,會隨 Laravel 5.3 一起發布。Echo 提供了簡單、優雅的 API 接口,支持你在 JavaScript 客戶端應用中,訂閱頻道和監聽服務器端事件。
Echo 提供的支持包括?[Pusher](https://pusher.com/)?以及?[Socket.io](http://socket.io/):
~~~
Echo.channel('orders.' + orderId)
.listen('ShippingStatusUpdated', (e) => {
console.log(e.description);
});
~~~
除了訂閱到傳統頻道上,Laravel Echo 也讓頻道的監聽與管理變得更加簡單:
~~~
Echo.join('chat.' + roomId)
.here((users) => {
//
})
.joining((user) => {
console.log(user.name);
})
.leaving((user) => {
console.log(user.name);
});
~~~
了解更多關于 Echo 和事件廣播的信息,請查閱?[完整文檔](https://laravel-china.org/docs/laravel/5.3/broadcasting).
### Laravel Passport (OAuth2 認證服務)
> {video} Laracasts 上關于此功能的免費視頻?[video tutorial](https://laracasts.com/series/whats-new-in-laravel-5-3/episodes/13)。
Laravel 5.3 的 Passport 讓 API 認證變得簡單。Laravel Passport 可以讓你在幾分鐘內為應用程序創建一個完整的 OAuth2 認證服務,Passport 基于 Alex Bilbie 的?[League OAuth2 server](https://github.com/thephpleague/oauth2-server)?實現。
Passport 讓發放 OAuth2 令牌(Access Token)變得輕松,你還可以允許用戶通過 Web 界面創建?`個人訪問令牌`。
為了方便提高開發效率,Passport 內置了一個 Vue 組件,該組件提供了 OAuth2 后臺界面功能,允許用戶創建客戶端、撤銷訪問令牌,以及更多其他功能:
~~~
<passport-clients></passport-clients>
<passport-authorized-clients></passport-authorized-clients>
<passport-personal-access-tokens></passport-personal-access-tokens>
~~~
如果你不想使用 Vue 組件,你可以自由的定制用于管理客戶端和訪問令牌的前端及后臺。Passport 提供了一個簡單的 JSON API,你可以在前端使用任何 JavaScript 框架與之集成。
Passport 還提供了方便的 API 讓你定制「Token 訪問域」:
~~~
Passport::tokensCan([
'place-orders' => 'Place new orders',
'check-status' => 'Check order status',
]);
~~~
此外,Passport 還包含了一個用于檢查「Token 訪問域」訪問權限的中間件:
~~~
Route::get('/orders/{order}/status', function (Order $order) {
// 檢查令牌是否擁有 "check-status" 訪問域
})->middleware('scope:check-status');
~~~
最后,Passport 還支持從 JavaScript 應用訪問你的 API,而不必擔心訪問令牌傳輸。
Passport 通過加密 JWT cookies 和同步「CSRF 令牌」來實現此功能,讓你專注于業務開發。
更多關于 Passport 信息,請查看?[完整文檔](https://laravel-china.org/docs/laravel/5.3/passport)。
### 搜索系統 Laravel Scout
Laravel Scout 提供了一個簡單的、基于驅動的、針對?[Eloquent](https://laravel-china.org/docs/laravel/5.3/eloquent)?模型的全文搜索解決方案。
通過模型觀察者,Scout 會自動同步更新 Eloquent 的搜索索引,目前,Scout使用?[Algolia](https://www.algolia.com/)?驅動,你可以自由的編寫自己驅動來擴展 Scout。
你只需要添加 Searchable trait 到模型中,就能讓模型支持搜索:
~~~
<?php
namespace App;
use Laravel\Scout\Searchable;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
use Searchable;
}
~~~
在你在模型中添加 trait 以后,數據會在?`save`?的時候自動保持同步:
~~~
$order = new Order;
// ...
$order->save();
~~~
在模型被成功索引以后,可以很輕松的使用全文搜索,你甚至可以為索引的結果進行分頁操作:
~~~
return Order::search('Star Trek')->get();
return Order::search('Star Trek')->where('user_id', 1)->paginate();
~~~
更多 Scout 功能,請查閱?[Scout 的完整文檔](https://laravel-china.org/docs/laravel/5.3/scout)。
### Mailable 對象
> {video} Laracasts 上關于此功能的免費視頻?[video tutorial](https://laracasts.com/series/whats-new-in-laravel-5-3/episodes/6)。
Laravel 5.3 Mailable 是一個嶄新的 Mail 操作類,通過一種更加優雅的方式發送郵件,而不再需要在閉包中自定義郵件信息。
例如,定義一個簡單的郵寄對象用作發送歡迎郵件:
~~~
class WelcomeMessage extends Mailable
{
use Queueable, SerializesModels;
/**
* 新建消息
*
* @return $this
*/
public function build()
{
return $this->view('emails.welcome');
}
}
~~~
Mailable 對象被創建以后,你可以使用一個簡單、優雅的 API 將其發送給用戶:
~~~
Mail::to($user)->send(new WelcomeMessage);
~~~
Mailable 還支持隊列操作,只需要在類聲明里實現?`ShouldQueue`?即可:
~~~
class WelcomeMessage extends Mailable implements ShouldQueue
{
//
}
~~~
更多關于 Mailable 的信息,請查看?[完整文檔](https://laravel-china.org/docs/laravel/5.3/mail)。
### 存儲上傳文件
> {video} Laracasts 上關于此功能的免費視頻?[video tutorial](https://laracasts.com/series/whats-new-in-laravel-5-3/episodes/12)。
存儲用戶上傳文件,在 Web 開發中是一個很常見的任務。
Laravel 5.3 提供了一個便捷的?`store`?方法,只需要對上傳文件對象調用此方法,并傳參準備存儲的路徑即可:
~~~
/**
* 更新用戶頭像
*
* @param Request $request
* @return Response
*/
public function update(Request $request)
{
$path = $request->file('avatar')->store('avatars', 's3');
return $path;
}
~~~
更多上傳文件信息,請查看?[完整文檔](https://laravel-china.org/docs/laravel/5.4/filesystem#file-uploads)。
### Webpack 和 Laravel Elixir
Laravel Elixir 6.0 與 Laravel 5.3 共同發布,內置了 Webpack 和 Rollup JavaScript。
默認情況下,Laravel 5.3 的?`gulpfile.js`?使用 Webpack 來編譯你的 JavaScript 文件:
~~~
elixir(mix => {
mix.sass('app.scss')
.webpack('app.js');
});
~~~
完整文檔請見?[Laravel Elixir](https://laravel-china.org/docs/laravel/5.3/elixir)?。
### 前端架構
> {video} Laracasts 上關于此功能的免費視頻?[video tutorial](https://laracasts.com/series/whats-new-in-laravel-5-3/episodes/4)。
Laravel 5.3 提供了一個更加現代的前端架構。這主要會影響?`make:auth`?命令生成認證相關的前端腳手架代碼,不再從 CDN 中加載前端資源,所有依賴被定義在默認的 package.json 文件中,你可以自行修改。
此外,支持單文件的?[Vue 組件](https://vuejs.org/)?現在直接開箱即用,?`resources/assets/js/components`?目錄下包含了一個簡單的示例?`Example.vue`,新的?`resources/assets/js/app.js`?用來配置 JavaScript 類庫依賴和 Vue 子模塊。
這種架構對開始開發現代的、強大的 JavaScript 應用提供了更好的支持,而不需要要求應用使用任何特定 JavaScript 或者 CSS 框架。
更多信息,請查看對應文檔?[前端文檔](https://laravel-china.org/docs/laravel/5.3/frontend)。
### 路由文件
默認情況下,新安裝的 Laravel 5.3 應用在新的頂級目錄?`routes`?下包含了?`web.php`?和?`api.php`?兩個?`HTTP`?路由文件,你也可以按照此方法自行擴展。
API 相關的路由在?`RouteServiceProvider`?中指定了自動添加?`api`?前綴。
### 閉包控制臺命令
除了通過命令類定義之外,Artisan 命令現支持在?`app/Console/Kernel.php`?文件中使用簡單閉包的方式定義。
在新安裝的 Laravel 5.3 應用中,`commands`?方法會加載?`routes/console.php`?文件,從而允許你基于閉包、以路由風格定義控制臺命令:
~~~
Artisan::command('build {project}', function ($project) {
$this->info('Building project...');
});
~~~
更多信息請參見?[Artisan 文檔](https://laravel-china.org/docs/laravel/5.3/artisan#closure-commands)。
### Blade 中的?`$loop`?魔術變量
> {video} Laracasts 上關于此功能的免費視頻?[video tutorial](https://laracasts.com/series/whats-new-in-laravel-5-3/episodes/7)。
當我們在 Blade 模板中循環遍歷的時候,`$loop`?魔術變量將會在循環中生效。通過該變量可以訪問很多有用的信息,比如當前循環索引值,以及當前循環是第一個還是最后一個:
~~~
@foreach ($users as $user)
@if ($loop->first)
This is the first iteration.
@endif
@if ($loop->last)
This is the last iteration.
@endif
<p>This is user {{ $user->id }}</p>
@endforeach
~~~
更多信息請查看?[Blade 文檔](https://laravel-china.org/docs/laravel/5.3/blade#the-loop-variable).
## Laravel 5.2
Laravel 5.2 在 Laravel 5.1 的基礎上進行了優化,新特性包括以下:
* 支持更多樣的用戶認證驅動;
* 隱式數據模型綁定;
* 簡化 Eloquent 全局作用域;
* 內置用戶認證腳手架支持;
* 中間件組;
* 訪問頻率限制中間件;
* 數組認證的優化等
### 用戶認證驅動 / "多認證系統"
在之前的 Laravel 版本中,框架只支持默認的、基于 session 的認證驅動,且在單個應用中只能擁有一個認證模型類。
Laravel 5.2 對此進行了改進,你可以定義多個認證驅動,還支持多個可認證的數據模型以及用戶表,并且可以獨立控制其認證。
例如,如果你的應用中有一張「admin」數據庫用戶表,一張「student」數據庫用戶表(一個后臺管理員用戶表和一個前臺學生用戶表),現在你可以使用?`Auth`?方法來實現后臺用戶和學生用戶的獨立登錄而不相互影響。
### 用戶認證腳手架
此前 Laravel 后端認證處理已經是相當容易了,現在 Laravel 5.2 提供了一個更加便捷、快速的方法來創建前臺認證視圖,只需要簡單的在終端執行?`make:auth`?命令即可。
~~~
php artisan make:auth
~~~
該命令會生成純文本的、兼容 Bootstrap 樣式的視圖用于登錄、注冊和密碼重置。該命令還會順帶在路由文件中增加對應的授權路由。
> {note} 該功能特性只能用于新創建的應用,不能用于升級后的應用。
### 隱式數據模型綁定
隱式模型綁定使得在路由和控制器中注入模型實例更加便捷。例如,假設你定義了一個如下的路由:
~~~
use App\User;
Route::get('/user/{user}', function (User $user) {
return $user;
});
~~~
在 Laravel 5.1 中,你通常需要通過?`Route::model`?方法告訴 Laravel 注入?`App\User`?實例以匹配路由定義中的?`{user}`?參數。
現在,在 Laravel 5.2 中,框架將會基于相應 URI 判斷?**自動**?注入模型,從而允許你快速訪問需要的模型實例。
如路由參數片段?`{user}`?匹配到?`路由閉包`?或?`控制器方法`?中對應參數?`$user`,且類型提示為 Eloquent 數據模型的話,Laravel 將會自動注入該模型。
更多隱式模型綁定信息,請查看?[HTTP 路由模型綁定部分](https://laravel-china.org/docs/laravel/5.4/routing#Route-Model-Binding)。
### 中間件群組
中間件群組允許你將多個路由中間件組織到單一、方便的鍵 (即群組名稱)下面,從而可以為某個路由一次指派多個中間件。例如,在同一個應用中構建 Web UI 或 API 時,這一特性很有用。例如,你可以將 session 及 CSRF 路由組合成一個?`web`?群組,并將訪問頻率限制分組到?`api`群組。
實際上,默認的 Laravel 5.2 應用結構采用的正是這種方法。例如,在默認的?`App\Http\Kernel.php`?文件中你會看到如下內容:
~~~
/**
* 路由中間件群組
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
],
'api' => [
'throttle:60,1',
],
];
~~~
然后,`web`?組可以這樣指定給路由:
~~~
Route::group(['middleware' => ['web']], function () {
//
});
~~~
默認的,所有的?`app/Http/routes.php`?中的路由?**已經**?在?`RouteServiceProvider`?的?`mapWebRoutes`?方法中指定了?`web`?中間件組,所以你不必重復指定。
### 訪問頻率限制
框架現在內置了一個新的訪問頻率限制中間件,允許你輕松控制給定 IP 地址在指定時間內對某個路由發起請求的數目。
例如,要限制某個 IP 地址每分鐘只能訪問某個路由 60 次,你可以這么做:
~~~
Route::get('/api/users', ['middleware' => 'throttle:60,1', function () {
//
}]);
~~~
### 數組輸入驗證
在 Laravel 5.2 中,可輕松驗證表單中的每一個數組輸入字段。例如,要驗證指定數組輸入字段中每一個 email 是否唯一,可以這么實現:
~~~
$validator = Validator::make($request->all(), [
'person.*.email' => 'email|unique:users'
]);
~~~
同樣的,你可以使用「 *」 符號來指定要驗證數組字段,自定義驗證數組字段的錯誤消息提醒:
~~~
'custom' => [
'person.*.email' => [
'unique' => '用戶的 Email 必須是唯一的',
]
],
~~~
### Bail 認證規則
Laravel 5.2 新添加了一個?`bail`?認證規則,此規則會在第一個失敗認證后停止后面的其他認證檢查。例如:你想在?`integer`?數值檢查失敗后停止對?`unique`?唯一性的檢查:
~~~
$this->validate($request, [
'user_id' => 'bail|integer|unique:users'
]);
~~~
### Eloquent 全局作用域優化
在之前的 Laravel 版本中,Eloquent 全局作用域的實現復雜且容易出錯,但在 Laravel 5.2 中,全局查詢作用域只需實現一個簡單的?`apply`?方法即可。
更多關于全局作用域的使用,請查閱?[Eloquent 文檔](https://laravel-china.org/docs/laravel/5.4/eloquent#global-scopes).
## Laravel 5.1.11
Laravel 5.1.11 推出了內置的?[授權](https://laravel-china.org/docs/laravel/5.4/authorization)?功能!利用回調和授權策略類,能更方便的組織應用程序的授權邏輯。
更多的信息請參考?[授權的文檔](https://laravel-china.org/docs/laravel/5.4/authorization)。
## Laravel 5.1.4
Laravel 5.1.4 增加了簡單的登錄限制功能。查閱?[認證的文檔](https://laravel-china.org/docs/laravel/5.4/authentication#authentication-throttling)?以獲取更多信息。
## Laravel 5.1
Laravel 5.1 由 Laravel 5.0 改進而成,變更包括但是不限于:
* 采用 PSR-2 規范
* 支持添加事件廣播
* 中間件參數
* Artisan 的改進等等。
### PHP 5.5.9+
由于 PHP 5.4 將在九月「結束壽命」,PHP 開發團隊不再提供安全性更新,所以 Laravel 要求 PHP 5.5.9 或更高的版本。
PHP 5.5.9 同時也是最新版本的 PHP 函數庫,像是 Guzzle 及 AWS SDK 需要的最小版本需要。
### LTS
Laravel 5.1 是 Laravel 生態系統中第一個?**長期支持**?版本。Laravel 5.1 會獲得兩年的 BUG 修復及三年的安全性修復,此策略也使 Laravel 能更好的服務于較大型的企業客戶及消費者。
### PSR-2
[PSR-2 代碼風格指南](https://phphub.org/topics/2079)?已經被 Laravel 框架采用為默認的代碼風格指南。此外,所有的生成器都已進行更新,生成的文件將兼容 PSR-2 規范。
### 文檔
Laravel 文檔的每一頁已被精心審閱,并得到顯著的改善。所有的代碼例子也進行了嚴密檢查,使其有更高的上下文關聯性。
### 事件廣播
WebSockets 技術越來越多的被現代 Web 應用使用,當服務器上一些數據更新,WebSocket 會實時發送一個消息給客戶端,實現即時更新用戶狀態功能。
Laravel 的事件廣播機制很好的支持了此類應用的開發,廣播事件允許服務器端代碼和 JavaScript 框架間分享相同的事件名稱。
了解更多關于事件廣播,請查閱?[事件的文檔](https://laravel-china.org/docs/laravel/5.4/events#broadcasting-events)。
### 中間件參數
中間件支持接收自定義傳參,例如要在運行特定操作之前,檢查當前登錄的用戶是否具備「某角色」,可以創建?`RoleMiddleware`?來接收角色名稱作為傳參:
~~~
<?php
namespace App\Http\Middleware;
use Closure;
class RoleMiddleware
{
/**
* 運行請求過濾。
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string $role
* @return mixed
*/
public function handle($request, Closure $next, $role)
{
if (! $request->user()->hasRole($role)) {
// 重定向...
}
return $next($request);
}
}
~~~
在路由中使用冒號?`:`?來區隔中間件名稱與參數,多個參數可使用逗號作為分隔:
~~~
Route::put('post/{id}', ['middleware' => 'role:editor', function ($id) {
//
}]);
~~~
關于中間件的更多信息,請查閱?[中間件的文檔](https://laravel-china.org/docs/laravel/5.4/middleware)。
### 測試改進
Laravel 內置的測試功能已得到顯著的改善,新版本提供了簡明的接口與應用程序進行交互,響應檢查也變得更加輕松。
例如下方的測試:
~~~
public function testNewUserRegistration()
{
$this->visit('/register')
->type('Taylor', 'name')
->check('terms')
->press('Register')
->seePageIs('/dashboard');
}
~~~
關于測試的更多信息,請查閱?[測試的文檔](https://laravel-china.org/docs/laravel/5.4/testing)。
### 模型工廠
Laravel 的?[模型工廠](https://laravel-china.org/docs/laravel/5.4/testing#model-factories)?提供一種簡單的方式來創建仿真 Eloquent 模型。
在為 Eloquent 模型定義一組「默認」填充字段后,即可為測試,或者數據填充生成測試模型實例。
另外,模型工廠支持使用?[Faker](https://github.com/fzaninotto/Faker)?來生成隨機數據:
~~~
$factory->define(App\User::class, function ($faker) {
return [
'name' => $faker->name,
'email' => $faker->email,
'password' => str_random(10),
'remember_token' => str_random(10),
];
});
~~~
更多關于模型工廠的信息,請查閱?[它的文檔](https://laravel-china.org/docs/laravel/5.4/testing#model-factories)。
### Artisan 的改進
Artisan 命令現支持類似于命名路由的定義,以簡單易懂的形式來定義命令行的參數及選項。
舉個例子,你可以定義一個簡單的命令及它的參數和選項,如下:
~~~
/**
* 命令行的名字及署名。
*
* @var string
*/
protected $signature = 'email:send {user} {--force}';
~~~
更多關于定義 Artisan 命令的消息,請參考?[Artisan 的文檔](https://laravel-china.org/docs/laravel/5.4/artisan)。
### 文件夾結構
為了更方便理解,`app/Commands`?目錄已經被更名為?`app/Jobs`。
此外,`app/Handler`?目錄已經被合并成一個只包含事件偵聽器的?`app/Listeners`?目錄中。
這不是一個重大的改變,你不必更新成新的文件夾結構也能使用 Laravel 5.1。
### 加密
在 Laravel 之前的版本,加密是通過?`mcrypt`?PHP 擴展進行處理。不過,從 Laravel 5.1 起,加密將采用更積極維護的?`openssl`?擴展進行處理。
## Laravel 5.0
Laravel 5.0 引進了新的應用程序架構。新架構允許 Laravel 創建更加健壯的應用程序,新架構全面采用新的自動加載標準(PSR-4)。
以下是一些主要變化:
### 新的目錄結構
舊的?`app/models`?目錄已經完全被移除。對應的,你所有的代碼都放在?`app`?目錄下。
默認情況下使用?`App`?命名空間。可以使用?`app:name`?Artisan 命令對默認命名空間進行修改。
控制器、中間件,以及表單請求(Laravel 5.0 中新型態的類),分門別類的放在?`app/Http`?目錄下,因為他們都與應用程序的 HTTP 傳輸層相關。除了一個路由設置的文件外,所有中間件現都分開為獨自的類文件。
`app/Providers`?目錄取代了舊版 Laravel 4.x?`app/start`?里的文件。這些服務提供者為應用程序提供了各種引導功能,像是錯誤處理,日志紀錄,路由加載等等。當然,你可以任意的創建新的服務提供者。
應用程序的語言文件和視圖都被移到?`resources`?目錄下。
### Contracts
所有 Laravel 組件實現所用的接口都放在?`illuminate/contracts`?文件夾中,他們沒有其他依賴。這些方便集成的接口,讓依賴注入變得低耦合,可簡單作為 Laravel Facades 的替代選項。
更多關于 contracts 的信息,參考?[完整文檔](https://laravel-china.org/docs/laravel/5.4/contracts)。
### 路由緩存
如果你的應用程序全部使用控制器路由,新的?`route:cache`?Artisan 命令可大幅度地優化路由注冊尋找速度。
這對于擁有 100 個以上路由規則的應用程序來說很有用,可以?**大幅度地**?加快應用程序路由部分的處理速度。
### 路由中間件
除了像 Laravel 4 風格的路由「過濾器」,Laravel 5 現在有 HTTP 中間件,而原本的認證和 CSRF 「過濾器」已經改寫成中間件。中間件提供了單個、一致的接口取代了各種過濾器,讓你在請求進到應用程序前,可以簡單地檢查甚至拒絕請求。
更多關于中間件的信息,參考?[完整文檔](https://laravel-china.org/docs/laravel/5.4/middleware)。
### 控制器方法注入
除了之前有的類的構造函數注入外,你現在可以在控制器方法中使用依賴注入。[服務容器](https://laravel-china.org/docs/laravel/5.4/container)?會自動注入依賴,即使路由包含了其它參數也不成問題:
~~~
public function createPost(Request $request, PostRepository $posts)
{
//
}
~~~
### 認證基本架構
認證系統默認包含了用戶注冊,認證,以及重設密碼的控制器,還有對應的視圖,視圖文件存放在?`resources/views/auth`。
除此之外,「users」數據表遷移也默認包含在框架中。這些簡單的資源,可以讓你把心思放在產品開發上,而不用陷在編寫認證模板的泥潭。
認證相關的視圖可以通過?`auth/login`?以及?`auth/register`?路由訪問。
`App\Services\Auth\Registrar`?會負責處理用戶認證和注冊用戶的相關邏輯。
### 事件對象
你現在可以將事件定義成對象,而不是僅使用字符串。例:
~~~
<?php
class PodcastWasPurchased
{
public $podcast;
public function __construct(Podcast $podcast)
{
$this->podcast = $podcast;
}
}
~~~
這個事件可以像一般使用那樣被派發:
~~~
Event::fire(new PodcastWasPurchased($podcast));
~~~
當然,你的事件處理會收到事件的對象而不是數據的列表:
~~~
<?php
class ReportPodcastPurchase
{
public function handle(PodcastWasPurchased $event)
{
//
}
}
~~~
更多關于使用事件的信息,參考?[完整文檔](https://laravel-china.org/docs/laravel/5.4/events)。
### 命令及隊列
除了 Laravel 4 形式的隊列任務,Laravel 5 還支持命令對象直接作為隊列任務。這些命令放在?`app/Commands`?目錄下。下面是個例子的命令:
~~~
<?php
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,讓你可以簡單的派發命令運行:
~~~
$this->dispatch(new PurchasePodcastCommand($user, $podcast));
~~~
當然,你也可以將命令視為同步運行(而不會被放到隊列里)的任務。事實上,「命令總線」是個不錯的設計模式,可以封裝應用程序需要運行的復雜任務。更多相關的信息,參考?[command bus](https://laravel-china.org/docs/laravel/5.4/bus)?文檔。
### 數據庫隊列
`database`?隊列驅動現在已經包含在 Laravel 中了,提供了簡單的本地端隊列驅動,除了數據庫相關軟件外不需安裝其它擴展包,完全開箱即用。
### Laravel 調度器
在過去,開發者是在 crontab 里配置任務調度的。然而,這是件很頭痛的事情,因為你的命令行調度不在版本控制中,并且必須登錄到服務器里才能添加新的 Cron 設置。
Laravel 命令行調度的存在,就是為了改變這一情況。
命令行調度系統讓你在 Laravel 里定義富有表達性的命令調度,而且只需要在服務器里設置一個 Cron 設置即可。
看起來如下:
~~~
$schedule->command('artisan:command')->dailyAt('15:00');
~~~
參考?[完整文檔](https://laravel-china.org/docs/laravel/5.4/artisan#scheduling-artisan-commands)?學習所有調度相關知識。
### Tinker 與 Psysh
`php artisan tinker`?命令現在使用 Justin Hileman 的?[Psysh](https://github.com/bobthecow/psysh),一個 PHP 更強大的 REPL。如果你喜歡 Laravel 4 的 Boris,你也會喜歡上 Psysh。更好的是,它可以在 Windows 上運行!
趕快嘗試下吧:
~~~
php artisan tinker
~~~
### DotEnv
比起一堆令人困惑的、嵌套的環境配置文件,Laravel 5 現在使用了 Vance Lucas 的?[DotEnv](https://github.com/vlucas/phpdotenv)。
這個擴展包提供了超級簡單的方式管理配置文件,并且讓 Laravel 5 環境偵測變得輕松。更多的細節,參考完整的?[配置文件文檔](https://laravel-china.org/docs/laravel/5.4/configuration#environment-configuration)。
### Laravel Elixir
Jeffrey Way 的 Laravel Elixir 提供了一個流暢、口語化的接口,可以編譯以及合并靜態資源。如果你曾經因為學習 Grunt 或 Gulp 而被嚇到,不必再害怕了。Elixir 讓使用 Gulp 編譯 Less、Sass 及 CoffeeScript 變得簡單。它甚至可以幫你運行測試!
更多關于 Elixir 的信息,參考?[完整文檔](https://laravel-china.org/docs/laravel/5.4/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 的認證流程,只要幾分鐘!查看?[完整文檔](https://laravel-china.org/docs/laravel/5.4/authentication#social-authentication)?里有所有的細節。
### 文件系統集成
Laravel 現在包含了強大的?[Flysystem 文件系統](https://github.com/thephpleague/flysystem)(一個文件系統的抽象函數庫)。
文件系統以抽象的概念,把本地端文件系統、Amazon S3 和 Rackspace 云存儲集成在一起,統一且優雅的 API!
現在要將文件存到 Amazon S3 相當簡單:
~~~
Storage::put('file.txt', 'contents');
~~~
更多關于 Laravel 文件系統集成,參考?[完整文檔](https://laravel-china.org/docs/laravel/5.4/filesystem)。
### Form Requests
Laravel 5.0 引進了?**form requests**,是繼承自?`Illuminate\Foundation\Http\FormRequest`?的類。這些 request 對象可以和控制器方法依賴注入結合使用,提供一個不需模版的方法,來驗證用戶輸入。讓我們深入點,看一個?`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 的服務容器辨別出要注入的類是個?`FormRequest`?實例,該請求將會被?**自動驗證**。意味著,框架會自動根據你在 form request 類里自定的規則,對請求進行檢驗。當控制器動作調用時,你可以安全的假設 HTTP 的請求輸入己被驗證過。
甚至,若這個請求驗證不通過,一個 HTTP 重定向(可以自定義),會自動發出,錯誤消息可以被閃存到 session 中或是轉換成 JSON 返回。**表單驗證再簡單不過了。**?更多關于?`FormRequest`?驗證,請參考?[文檔](https://laravel-china.org/docs/laravel/5.4/validation#form-request-validation)。
### 簡易控制器請求驗證
Laravel 5 基底控制器包含一個?`ValidatesRequests`?trait。這個 trait 包含了一個簡單的?`validate`?方法可以驗證請求。如果對你的應用程序來說?`FormRequests`?太復雜了,可以考慮使用手動驗證方法:
~~~
public function createPost(Request $request)
{
$this->validate($request, [
'title' => 'required|max:255',
'body' => 'required',
]);
}
~~~
如果驗證失敗,會拋出異常以及返回適當的 HTTP 響應到瀏覽器。驗證錯誤信息會被閃存到 session 里!而如果請求是 AJAX 請求,Laravel 會自動返回 JSON 格式的驗證錯誤信息。
更多關于這個新方法的信息,參考?[這個文檔](https://laravel-china.org/docs/laravel/5.4/validation#controller-validation)。
### 新的生成器
為了響應新的應用程序默認架構,框架新增了許多 Artisan generator 命令。使用?`php artisan list`?查看完整的命令列表。
### 配置文件緩存
你現在可以通過?`config:cache`?命令將所有的配置文件緩存在單個文件中,這樣在一定程度上會加快框架的啟動效率。
### Symfony VarDumper
廣為使用的?`dd`?輔助函數,用作在調試時輸出變量信息,現采用令人驚艷的 Symfony VarDumper 擴展包。它提供了顏色標記的輸出,甚至數組可以自動縮合。在項目中試試下列代碼:
~~~
dd([1, 2, 3]);
~~~
## Laravel 4.2
此發行版本的完整的變更列表可以通過運行?`php artisan changes`?命令來獲取,或者?[Github 上的更動紀錄](https://github.com/laravel/framework/blob/4.2/src/Illuminate/Foundation/changes.json)。此紀錄僅含括主要更新和此發行的更動部分。
> **附注:**?在 4.2 開發期間,許多小的 BUG 修正與功能強化被整合至各個 4.1 的子發行版本中。所以,也請一并檢查 Laravel 4.1 版本的更新列表。
### PHP 5.4 需求
Laravel 4.2 需要 PHP 5.4 以上的版本。此 PHP 更新版本讓我們可以使用 PHP 的新功能:traits 來為像是?[Laravel 收銀臺](https://laravel-china.org/docs/billing)來提供更具表達力的接口。PHP 5.4 也比 PHP 5.3 帶來顯著的速度及性能提升。
### Laravel Forge
Larvel Forge,一個網頁應用程序,提供一個簡單的接口讓你創建管理云端上的 PHP 服務器,像是 Linode、DigitalOcean、Rackspace 和 Amazon EC2。
支持自動化 nginx 設置、SSH 密鑰管理、Cron job 自動化、通過 NewRelic & Papertrail 服務器監控、「推送部署」、Laravel queue worker 設置等等。Forge 提供最簡單且更實惠的方式來部署所有你的 Laravel 應用程序。
默認 Laravel 4.2 的安裝里,`app/config/database.php`?配置文件已為 Forge 設置完成,讓你更方便的完成新平臺上的全新應用程序的部署。
關于 Laravel Forge 的更多信息可以在?[官方 Forge 網站](https://forge.laravel.com/)?上找到。
### Laravel Homestead
Laravel Homestead 是一個健全的 Laravel 和 PHP 應用程序 Vagrant 環境。軟件依賴都已提前準備好,可以極快的被啟用。
Homestead 包含 Nginx 1.6、PHP 5.5.12、MySQL、Postres、Redis、Memcached、Beanstalk、Node、Gulp、Grunt 和 Bower。Homestead 包含一個簡單的?`Homestead.yaml`?配置文件,允許你在單個封裝包中管理多個 Laravel 應用程序。
默認的 Laravel 4.2 安裝中包含的?`app/config/local/database.php`?配置文件已經為你配置好了 Homestead 的數據庫連接。讓 Laravel 初始化安裝與設置更為方便。
官方文檔已經更新并包含在?[Homestead 文檔](https://laravel-china.org/docs/homestead)?中。
### Laravel 收銀臺
Laravel 收銀臺是一個簡單、具表達性的資源庫,用來管理 Stripe 的訂閱服務。雖然安裝此組件是可選的,我們仍然將收銀臺文檔包含在主要 Laravel 文檔中。新版本的收銀臺帶來了數個錯誤修正、多貨幣支持還有支持了最新的 Stripe API。
### Queue Workers 常駐程序
Artisan?`queue:work`?命令現在支持?`--daemon`?參數讓 worker 可以作為「常駐程序」啟用。代表 worker 可以持續的處理隊列工作,而不需要重啟框架。這讓一個復雜的應用程序對 CPU 的使用率有顯著的降低。
更多關于 Queue Workers 常駐程序信息請詳閱?[queue 文檔](https://laravel-china.org/docs/queues#daemon-queue-worker)。
### Mail API Drivers
Laravel 4.2 為?`Mail`?類采用了新的 Mailgun 和 Mandrill API 驅動。對許多應用程序而言,他提供了比 SMTP 更快也更可靠的方法來遞送郵件。新的驅動使用了 Guzzle 4 HTTP 資源庫。
### 軟刪除 Traits
PHP 5.4 的?`traits`?提供了一個更加簡潔的軟刪除架構和全局作用域,這些新架構為框架提供了更有擴展性的功能,并且讓框架更加簡潔。
更多關于軟刪除的文檔請見:?[Eloquent documentation](https://laravel-china.org/docs/eloquent#soft-deleting)。
### 更為方便的 認證(auth) & Remindable Traits
得益于 PHP 5.4 traits,我們有了一個更簡潔的用戶認證和密碼提醒接口,這也讓?`User`?模型文檔更加精簡。
### "簡易分頁"
一個新的?`simplePaginate`?方法已被加入到查找以及 Eloquent 查找器中。讓你在分頁視圖中,使用簡單的「上一頁」和「下一頁」鏈接查找更為高效。
### 遷移確認
在正式環境中,破壞性的遷移動作將會被再次確認。如果希望取消提示字符確認請使用?`--force`?參數。
## Laravel 4.1
### 完整更動列表
此發行版本的完整更動列表,可以在版本 4.1 的安裝中命令行運行?`php artisan changes`?獲取,或者瀏覽?[Github 更新文件中](https://github.com/laravel/framework/blob/4.1/src/Illuminate/Foundation/changes.json)?中了解。其中只記錄了該版本比較主要的強化功能和更動。
### 新的 SSH 組件
一個全新的?`SSH`?組件在此發行版本中登場。此功能讓你可以輕易的 SSH 至遠程服務器并運行命令。更多信息,可以參閱?[SSH 組件文檔](https://laravel-china.org/docs/ssh)。
新的?`php artisan tail`?命令就是使用這個新的 SSH 組件。更多的信息,請參閱?`tail`?[命令集文檔](http://laravel-china.org/docs/laravel/ssh#tailing-remote-logs)。
### Boris In Tinker
如果你的系統支持?[Boris REPL](https://github.com/d11wtq/boris),`php artisan thinker`?命令將會使用到它。系統中也必須先行安裝好?`readline`?和?`pcntl`?兩個 PHP 擴展包。如果你沒這些擴展包,從 4.0 之后將會使用到它。
### Eloquent 強化
Eloquent 添加了新的?`hasManyThrough`?關系鏈。想要了解更多,請參見?[Eloquent 文檔](https://laravel-china.org/docs/eloquent#has-many-through)。
一個新的?`whereHas`?方法也同時登場,他將允許?[檢索基于關系模型](https://laravel-china.org/docs/eloquent#querying-relations)。
### 數據庫讀寫分離
Query Builder 和 Eloquent 目前通過數據庫層,已經可以自動做到讀寫分離。更多的信息,請參考?[文檔](https://laravel-china.org/docs/database#read-write-connections)。
### 隊列排序
隊列排序已經被支持,只要在?`queue:listen`?命令后將隊列以逗號分隔送出。
### 失敗隊列作業處理
現在隊列將會自動處理失敗的作業,只要在?`queue:listen`?后加上?`--tries`?即可。更多的失敗作業處理可以參見?[隊列文檔](https://laravel-china.org/docs/queues#failed-jobs)。
### 緩存標簽
緩存「區塊」已經被「標簽」取代。緩存標簽允許你將多個「標簽」指向同一個緩存對象,而且可以清空所有被指定某個標簽的所有對象。更多使用緩存標簽信息請見?[緩存文檔](https://laravel-china.org/docs/cache#cache-tags)。
### 更具彈性的密碼提醒
密碼提醒引擎已經可以提供更強大的開發彈性,如:認證密碼、顯示狀態消息等等。使用強化的密碼提醒引擎,更多的信息?[請參閱文檔](https://laravel-china.org/docs/security#password-reminders-and-reset)。
### 強化路由引擎
Laravel 4.1 擁有一個完全重新編寫的路由層。API 一樣不變。然而與 4.0 相比,速度快上 100%。整個引擎大幅的簡化,且路由表達式大大減少對 Symfony Routing 的依賴。
### 強化 Session 引擎
此發行版本中,我們亦發布了全新的 Session 引擎。如同路由增進的部分,新的 Session 層更加簡化且更快速。我們不再使用 Symfony 的 Session 處理工具,并且使用更簡單、更容易維護的自定義解法。
### Doctrine DBAL
如果你有在你的遷移中使用到?`renameColumn`,之后你必須在?`composer.json`?里加?`doctrine/dbal`?進依賴擴展包中。此擴展包不再默認包含在 Laravel 之中。
- 前言
- 翻譯說明
- 發行說明
- 升級說明
- 貢獻導引
- 入門指南
- 安裝
- 配置信息
- 文件夾結構
- 請求周期
- 開發環境部署
- Homestead
- Valet
- 核心概念
- 服務容器
- 服務提供者
- Facades
- Contracts
- HTTP層
- 路由
- 中間件
- CSRF 保護
- 控制器
- 請求
- 響應
- 視圖
- Session
- 表單驗證
- 前端
- Blade 模板
- 本地化
- 前端指南
- 編輯資源 Mix
- 安全
- 用戶認證
- Passport OAuth 認證
- 用戶授權
- 加密解密
- 哈希
- 重置密碼
- 綜合話題
- Artisan 命令行
- 廣播系統
- 緩存系統
- 集合
- 錯誤與日志
- 事件系統
- 文件存儲
- 輔助函數
- 郵件發送
- 消息通知
- 擴展包開發
- 隊列
- 任務調度
- 數據庫
- 快速入門
- 查詢構造器
- 分頁
- 數據庫遷移
- 數據填充
- Redis
- Eloquent ORM
- 快速入門
- 模型關聯
- Eloquent 集合
- 修改器
- 序列化
- 測試
- 快速入門
- HTTP 測試
- 瀏覽器測試 Dusk
- 數據庫測試
- 測試模擬器
- 官方擴展包
- Cashier 交易工具包
- Envoy 部署工具
- Scout 全文搜索
- Socialite 社會化登錄