# 發行說明
- [支持策略](#support-policy)
- [Laravel 5.3](#laravel-5.3)
- [Laravel 5.2](#laravel-5.2)
- [Laravel 5.1.11](#laravel-5.1.11)
- [Laravel 5.1.4](#laravel-5.1.4)
- [Laravel 5.1](#laravel-5.1)
- [Laravel 5.0](#laravel-5.0)
- [Laravel 4.2](#laravel-4.2)
- [Laravel 4.1](#laravel-4.1)
<a name="support-policy"></a>
## 支持策略
Laravel 5.1 LTS 版本會提供兩年的 BUG 修復及三年的安全性修復,LTS 版本是 Laravel 能提供的維護時間最長的發行版。
對于一般的版本,會提供六個月的 BUG 修復及一年的安全性修復。
> [Laravel 的發布路線圖](https://phphub.org/topics/2594) - by [Summer](http://github.com/summerblue)
<a name="laravel-5.3"></a>
## Laravel 5.3
Laravel 5.3 在 5.2 基礎上進行了優化,新特性包括以下:
* [消息通知系統 Laravel Notifications](/docs/5.3/notifications);
* [事件廣播系統 Laravel Echo](/docs/5.3/broadcasting);
* [Laravel Passport 快速 OAuth2 服務器的擴展包](/docs/5.3/passport);
* [Laravel Scout 全文搜索引擎](/docs/5.3/scout);
* Laravel Elixir 開始支持 Webpack;
* 郵件操作 Laravel Mailable;
* `web` 和 `api` 的路由分離;
* 基于閉包的控制臺命令;
* 上傳文件存儲的幫助函數;
* 支持 POPO 和單動作控制;
* 優化默認前端腳手架,等。
### 消息通知 Notifications
> {video} Laracasts 上關于此功能的免費視頻 [video tutorial](https://laracasts.com/series/whats-new-in-laravel-5-3/episodes/9)。
Laravel Notifications 提供了簡單、優雅的 API 支持你在不同的發送媒介中發送通知,例如郵件、SMS、Slack 等等。
例如,你可以定義一個單據已經支付的通知,然后通過郵件和 SMS 發送這個通知:
$user->notify(new InvoicePaid($invoice));
[Laravel 社區](http://laravel-notification-channels.com) 已經為通知系統編寫了各式的驅動,甚至包括對 iOS 和 Android 通知的支持,更多關于通知系統的信息,請查看 [完整的文檔](/docs/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 為客戶端 JavaScript 中監聽服務器端事件提供了簡單、優雅的 API 接口。
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);
});
更多信息請查閱 [完整文檔](/docs/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 信息,請查看 [完整文檔](/docs/5.3/passport)。
### 搜索系統 (Laravel Scout)
Laravel Scout 提供了一個簡單的、基于驅動的、針對 [Eloquent](/docs/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 的完整文檔](/docs/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;
/**
* Build the message.
*
* @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 的信息,請查看 [完整文檔](/docs/5.3/mail)。
### 存儲上傳文件
> {video} Laracasts 上關于此功能的免費視頻 [video tutorial](https://laracasts.com/series/whats-new-in-laravel-5-3/episodes/12)。
存儲用戶上傳文件,在 Web 開發中是一個很常見的任務。
Laravel 5.3 提供了一個便捷的 `store` 方法,只需要對上傳文件對象調用此方法,并傳參準備存儲的路徑即可:
/**
* Update the avatar for the user.
*
* @param Request $request
* @return Response
*/
public function update(Request $request)
{
$path = $request->file('avatar')->store('avatars', 's3');
return $path;
}
更多上傳文件信息,請查看 [完整文檔](/docs/{{version}}/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](/docs/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 組件現在直接開箱即用, `resources/assets/js/components` 目錄下包含了一個簡單的示例 `Example.vue`,新的 `resources/assets/js/app.js` 用來配置 JavaScript 類庫依賴和 Vue 子模塊。
這種架構對開始開發現代的、強大的 JavaScript 應用提供了更好的支持,而不需要要求應用使用任何特定 JavaScript 或者 CSS 框架。
更多信息,請查看對應文檔 [前端文檔](/docs/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 文檔](/docs/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 文檔](/docs/5.3/blade#the-loop-variable).
<a name="laravel-5.2"></a>
## Laravel 5.2
Laravel 5.2 在 Laravel 5.1 的基礎上進行了優化,新特性包括以下:
* 支持更多樣的用戶認證驅動;
* 隱式數據模型綁定;
* 簡化 Eloquent 全局作用域;
* 內置用戶認證腳手架支持;
* 中間件組;
* 訪問頻率限制中間件;
* 數組認證的優化等
### 用戶認證驅動 / "多認證系統"
在之前的 Laravel 版本中,框架只支持默認的、基于 session 的認證驅動,且在單個應用中只能擁有一個認證模型類。
Laravel 5.2 對此進行了改進,你可以定義多個認證驅動,還支持多個可認證的數據模型以及用戶表,并且可以獨立控制其認證。
如果你的應用包含 `管理員用戶數據表` 和一個 `學生用戶數據表`,現在你可以使用 `Auth` 來實現管理員用戶和學生用戶的獨立登錄而互不影響。
### 用戶認證腳手架
Laravel 不止提供服務器端的用戶認證邏輯代碼,Laravel 5.2 還提供了便捷的方式來創建認證視圖,只需在終端執行下 `make:auth` 命令即可:
php artisan make:auth
該命令會生成純文本、兼容 Bootstrap 樣式,用于登錄、注冊和密碼重置的視圖。該命令還會順帶在路由文件中增加對應的授權路由。
> **注意**:該功能特性只能在新應用中使用,不能在應用升級過程中使用。
### 隱式數據模型綁定
隱式模型綁定使得在路由和控制器中注入模型實例更加便捷。假設你有一個路由定義如下:
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 路由模型綁定部分](/docs/{{version}}/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 文檔](/docs/{{version}}/eloquent#global-scopes).
<a name="laravel-5.1.11"></a>
## Laravel 5.1.11
Laravel 5.1.11 推出了內置的 [授權](/docs/{{version}}/authorization) 功能!利用回調和授權策略類,能更方便的組織應用程序的授權邏輯。
更多的信息請參考 [授權的文檔](/docs/{{version}}/authorization)。
<a name="laravel-5.1.4"></a>
## Laravel 5.1.4
Laravel 5.1.4 增加了簡單的登錄限制功能。查閱 [認證的文檔](/docs/{{version}}/authentication#authentication-throttling) 以獲取更多信息。
<a name="laravel-5.1"></a>
## 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 框架間分享相同的事件名稱。
了解更多關于事件廣播,請查閱 [事件的文檔](/docs/{{version}}/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) {
//
}]);
關于中間件的更多信息,請查閱 [中間件的文檔](/docs/{{version}}/middleware)。
### 測試改進
Laravel 內置的測試功能已得到顯著的改善,新版本提供了簡明的接口與應用程序進行交互,響應檢查也變得更加輕松。
例如下方的測試:
public function testNewUserRegistration()
{
$this->visit('/register')
->type('Taylor', 'name')
->check('terms')
->press('Register')
->seePageIs('/dashboard');
}
關于測試的更多信息,請查閱 [測試的文檔](/docs/{{version}}/testing)。
### 模型工廠
Laravel 的 [模型工廠](/docs/{{version}}/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),
];
});
更多關于模型工廠的信息,請查閱 [它的文檔](/docs/{{version}}/testing#model-factories)。
### Artisan 的改進
Artisan 命令現支持類似于命名路由的定義,以簡單易懂的形式來定義命令行的參數及選項。
舉個例子,你可以定義一個簡單的命令及它的參數和選項,如下:
/**
* 命令行的名字及署名。
*
* @var string
*/
protected $signature = 'email:send {user} {--force}';
更多關于定義 Artisan 命令的消息,請參考 [Artisan 的文檔](/docs/{{version}}/artisan)。
### 文件夾結構
為了更方便理解,`app/Commands` 目錄已經被更名為 `app/Jobs`。
此外,`app/Handler` 目錄已經被合并成一個只包含事件偵聽器的 `app/Listeners` 目錄中。
這不是一個重大的改變,你不必更新成新的文件夾結構也能使用 Laravel 5.1。
### 加密
在 Laravel 之前的版本,加密是通過 `mcrypt` PHP 擴展進行處理。不過,從 Laravel 5.1 起,加密將采用更積極維護的 `openssl` 擴展進行處理。
<a name="laravel-5.0"></a>
## 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 的信息,參考 [完整文檔](/docs/{{version}}/contracts)。
### 路由緩存
如果你的應用程序全部使用控制器路由,新的 `route:cache` Artisan 命令可大幅度地優化路由注冊尋找速度。
這對于擁有 100 個以上路由規則的應用程序來說很有用,可以 **大幅度地** 加快應用程序路由部分的處理速度。
### 路由中間件
除了像 Laravel 4 風格的路由「過濾器」,Laravel 5 現在有 HTTP 中間件,而原本的認證和 CSRF 「過濾器」已經改寫成中間件。中間件提供了單個、一致的接口取代了各種過濾器,讓你在請求進到應用程序前,可以簡單地檢查甚至拒絕請求。
更多關于中間件的信息,參考 [完整文檔](/docs/{{version}}/middleware)。
### 控制器方法注入
除了之前有的類的構造函數注入外,你現在可以在控制器方法中使用依賴注入。[服務容器](/docs/{{version}}/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)
{
//
}
}
更多關于使用事件的信息,參考 [完整文檔](/docs/{{version}}/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](/docs/{{version}}/bus) 文檔。
### 數據庫隊列
`database` 隊列驅動現在已經包含在 Laravel 中了,提供了簡單的本地端隊列驅動,除了數據庫相關軟件外不需安裝其它擴展包,完全開箱即用。
### Laravel 調度器
在過去,開發者是在 crontab 里配置任務調度的。然而,這是件很頭痛的事情,因為你的命令行調度不在版本控制中,并且必須登錄到服務器里才能添加新的 Cron 設置。
Laravel 命令行調度的存在,就是為了改變這一情況。
命令行調度系統讓你在 Laravel 里定義富有表達性的命令調度,而且只需要在服務器里設置一個 Cron 設置即可。
看起來如下:
$schedule->command('artisan:command')->dailyAt('15:00');
參考 [完整文檔](/docs/{{version}}/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 環境偵測變得輕松。更多的細節,參考完整的 [配置文件文檔](/docs/{{version}}/configuration#environment-configuration)。
### Laravel Elixir
Jeffrey Way 的 Laravel Elixir 提供了一個流暢、口語化的接口,可以編譯以及合并靜態資源。如果你曾經因為學習 Grunt 或 Gulp 而被嚇到,不必再害怕了。Elixir 讓使用 Gulp 編譯 Less、Sass 及 CoffeeScript 變得簡單。它甚至可以幫你運行測試!
更多關于 Elixir 的信息,參考 [完整文檔](/docs/{{version}}/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 的認證流程,只要幾分鐘!查看 [完整文檔](/docs/{{version}}/authentication#social-authentication) 里有所有的細節。
### 文件系統集成
Laravel 現在包含了強大的 [Flysystem 文件系統](https://github.com/thephpleague/flysystem)(一個文件系統的抽象函數庫)。
文件系統以抽象的概念,把本地端文件系統、Amazon S3 和 Rackspace 云存儲集成在一起,統一且優雅的 API!
現在要將文件存到 Amazon S3 相當簡單:
Storage::put('file.txt', 'contents');
更多關于 Laravel 文件系統集成,參考 [完整文檔](/docs/{{version}}/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` 驗證,請參考 [文檔](/docs/{{version}}/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 格式的驗證錯誤信息。
更多關于這個新方法的信息,參考 [這個文檔](/docs/{{version}}/validation#controller-validation)。
### 新的生成器
為了響應新的應用程序默認架構,框架新增了許多 Artisan generator 命令。使用 `php artisan list` 查看完整的命令列表。
### 配置文件緩存
你現在可以通過 `config:cache` 命令將所有的配置文件緩存在單個文件中,這樣在一定程度上會加快框架的啟動效率。
### Symfony VarDumper
廣為使用的 `dd` 輔助函數,用作在調試時輸出變量信息,現采用令人驚艷的 Symfony VarDumper 擴展包。它提供了顏色標記的輸出,甚至數組可以自動縮合。在項目中試試下列代碼:
dd([1, 2, 3]);
<a name="laravel-4.2"></a>
## 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 收銀臺](/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 文檔](/docs/homestead) 中。
### Laravel 收銀臺
Laravel 收銀臺是一個簡單、具表達性的資源庫,用來管理 Stripe 的訂閱服務。雖然安裝此組件是可選的,我們仍然將收銀臺文檔包含在主要 Laravel 文檔中。新版本的收銀臺帶來了數個錯誤修正、多貨幣支持還有支持了最新的 Stripe API。
### Queue Workers 常駐程序
Artisan `queue:work` 命令現在支持 `--daemon` 參數讓 worker 可以作為「常駐程序」啟用。代表 worker 可以持續的處理隊列工作,而不需要重啟框架。這讓一個復雜的應用程序對 CPU 的使用率有顯著的降低。
更多關于 Queue Workers 常駐程序信息請詳閱 [queue 文檔](/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](/docs/eloquent#soft-deleting)。
### 更為方便的 認證(auth) & Remindable Traits
得益于 PHP 5.4 traits,我們有了一個更簡潔的用戶認證和密碼提醒接口,這也讓 `User` 模型文檔更加精簡。
### "簡易分頁"
一個新的 `simplePaginate` 方法已被加入到查找以及 Eloquent 查找器中。讓你在分頁視圖中,使用簡單的「上一頁」和「下一頁」鏈接查找更為高效。
### 遷移確認
在正式環境中,破壞性的遷移動作將會被再次確認。如果希望取消提示字符確認請使用 `--force` 參數。
<a name="laravel-4.1"></a>
## 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 組件文檔](/docs/ssh)。
新的 `php artisan tail` 命令就是使用這個新的 SSH 組件。更多的信息,請參閱 `tail` [命令集文檔](http://laravel.com/docs/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 文檔](/docs/eloquent#has-many-through)。
一個新的 `whereHas` 方法也同時登場,他將允許 [檢索基于關系模型](/docs/eloquent#querying-relations)。
### 數據庫讀寫分離
Query Builder 和 Eloquent 目前通過數據庫層,已經可以自動做到讀寫分離。更多的信息,請參考 [文檔](/docs/database#read-write-connections)。
### 隊列排序
隊列排序已經被支持,只要在 `queue:listen` 命令后將隊列以逗號分隔送出。
### 失敗隊列作業處理
現在隊列將會自動處理失敗的作業,只要在 `queue:listen` 后加上 `--tries` 即可。更多的失敗作業處理可以參見 [隊列文檔](/docs/queues#failed-jobs)。
### 緩存標簽
緩存「區塊」已經被「標簽」取代。緩存標簽允許你將多個「標簽」指向同一個緩存對象,而且可以清空所有被指定某個標簽的所有對象。更多使用緩存標簽信息請見 [緩存文檔](/docs/cache#cache-tags)。
### 更具彈性的密碼提醒
密碼提醒引擎已經可以提供更強大的開發彈性,如:認證密碼、顯示狀態消息等等。使用強化的密碼提醒引擎,更多的信息 [請參閱文檔](/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模板
- 本地化
- Javascript與CSS
- 入門指南
- laravel-elixir
- 安全
- 用戶認證
- 用戶授權
- 重置密碼
- API授權
- 加密解密
- 哈希
- 綜合話題
- 廣播系統
- 緩存系統
- 事件系統
- 文件存儲
- 郵件發送
- 消息通知
- 隊列
- 數據庫
- 快速入門
- 查詢構造器
- 分頁
- 數據庫遷移
- 數據填充
- redis
- Eloquent ORM
- 快速入門
- 模型關聯
- Eloquent集合
- 修改器
- 序列化
- Artisan控制臺
- Artisan 命令行
- 任務調度
- 測試
- 快速入門
- 應用程序測試
- 數據庫測試
- 模擬器
- 官方擴展包
- Cashier交易包
- Envoy 部署工具
- Passport OAuth 認證
- Scout 全文搜索
- Socialite 社交化登錄
- 附錄
- 集合
- 輔助函數
- 擴展包開發
- 交流說明