發(fā)行說明
發(fā)行說明
發(fā)行說明
- 版本控制方案
- 支持策略
- Laravel 5.8
版本控制方案
Laravel 的版本控制方案使用以下約定: 主版本號.次版本號.修訂號
。次版本號框架每六個(gè)月(二月和八月)發(fā)布,而修訂號版本可能每周發(fā)布一次,修訂號版本 不 包含重大更改。
當(dāng)你從應(yīng)用程序中或者在包中引用 Laravel 框架或者其他組件時(shí),應(yīng)該始終使用版本約束,例如 5.7.*
,因?yàn)?Laravel 的次要版本包含重大更改。但是,我們會努力確保你可以在一天或者更短時(shí)間內(nèi)完成更新。
主要版本之間的發(fā)布往往需要很多年,每次發(fā)布代表框架架構(gòu)和底層結(jié)構(gòu)發(fā)生了根本的改變。而目前并沒有準(zhǔn)備開發(fā)主版本號的計(jì)劃。
支持策略
對于 LTS 版本,例如 5.5,提供兩年的錯誤修復(fù)和三年的安全修復(fù)。這些版本提供最長時(shí)間的支持和維護(hù)。對于一般版本,則只是提供六個(gè)月的錯誤修復(fù)和一年的安全修復(fù)。
版本 | 發(fā)布時(shí)間 | Bug 修復(fù)截止時(shí)間 | 安全修復(fù)截止時(shí)間 |
---|---|---|---|
5.0 | 2015 年 2 月 4 日 | 2015 年 8 月 4 日 | 2016 年 2 月 4 日 |
5.1 (LTS) | 2015 年 6 月 9 日 | 2017 年 6 月 9 日 | 2018 年 6 月 9 日 |
5.2 | 2015 年 12 月 21 日 | 2016 年 6 月 21 日 | 2016 年 12 月 21 日 |
5.3 | 2016 年 8 月 23 日 | 2017 年 9 月 23 日 | 2017 年 8 月 23 日 |
5.4 | 2017 年 1 月 24 日 | 2017 年 7 月 24 日 | 2018 年 1 月 24 日 |
5.5 (LTS) | 2017 年 8 月 30 日 | 2019 年 8 月 30 日 | 2020 年 8 月 30 日 |
5.6 | 2018 年 2 月 7 日 | 2018 年 8 月 7 日 | 2019 年 2 月 7 日 |
5.7 | 2018 年 9 月 4 日 | 2019 年 3 月 4 日 | 2019 年 9 月 4 日 |
5.8 | 2019 年 2 月 26 日 | 2019 年 8 月 26 日 | 2020 年 2 月 26 日 |
Laravel 5.8
Laravel 5.8 在 Laravel 5.7 的基礎(chǔ)上繼續(xù)進(jìn)行優(yōu)化,包括引入新的 Eloquent 關(guān)聯(lián)關(guān)系(has-one-through)、優(yōu)化郵箱驗(yàn)證、基于約定的授權(quán)策略類自動注冊、 DynamoDB 緩存及 Session 驅(qū)動、優(yōu)化任務(wù)調(diào)度器的時(shí)區(qū)配置、支持分配多個(gè)認(rèn)證 guard 到廣播頻道、PSR-16 緩存驅(qū)動規(guī)范、優(yōu)化 artisan serve
命令、支持 PHPUnit 8.0、支持 Carbon 2.0 、支持 Pheanstalk 4.0 ,以及多個(gè) bug 修復(fù)和可用性的提升。
Eloquent HasOneThrough
關(guān)聯(lián)關(guān)系
Eloquent 現(xiàn)在提供了對 hasOneThrough
關(guān)聯(lián)類型的支持。例如,假設(shè) Supplier 模型類與 Account 模型類之間是一對一關(guān)聯(lián),并且 Account 模型類與 AccountHistory 模型類之間也是一對一關(guān)聯(lián),那么 Supplier 模型類與 AccountHistory 模型類之間可以通過 hasOneThrough
方法基于 Account 模型類建立遠(yuǎn)層的一對一關(guān)聯(lián)。你可以用 hasOneThrough
關(guān)聯(lián)關(guān)系通過 Account 模型類訪問 AccountHistory 模型類:
/** * Get the account history for the supplier. */ public function accountHistory() { return $this->hasOneThrough(AccountHistory::class, Account::class); }
自動尋找模型策略
當(dāng)使用 Laravel 5.7 時(shí),每個(gè)模型對應(yīng)的 認(rèn)證策略 都需要被顯式地注冊到應(yīng)用的 AuthServiceProvider
中:
/** * 當(dāng)前應(yīng)用的策略對應(yīng)關(guān)系 * * @var array */ protected $policies = [ 'App\User' => 'App\Policies\UserPolicy', ];
Laravel 5.8 引進(jìn)了模型策略的自動尋找,只要模型和策略的命名符合 Laravel 的標(biāo)準(zhǔn)約定。即策略必須在 Policies
路徑下,該路徑之上包含模型。舉個(gè)例子,模型可能放在 app
路徑下,則策略可以在放 app/Policies
路徑下。另外,策略名稱必須匹配模型名稱并且加上 Policy
后綴。這樣, User
模型將會對應(yīng)上 UserPolicy
類。
如果你想要提供自己的策略尋找邏輯,你可以使用 Gate::guessPolicyNamesUsing
方法來注冊一個(gè)自定義的回調(diào)函數(shù)。通常來說,這個(gè)方法應(yīng)該從你應(yīng)用的 AuthServiceProvider
中被調(diào)用:
use Illuminate\Support\Facades\Gate; Gate::guessPolicyNamesUsing(function ($modelClass) { // return policy class name... });
{note} 任何被顯式地映射到
AuthServiceProvider
中的策略都將優(yōu)先于隱式自動尋找策略。
PSR-16 緩存規(guī)范
為了在存儲緩存項(xiàng)時(shí)允許更細(xì)粒度的過期時(shí)間并遵守 PSR-16 緩存標(biāo)準(zhǔn),我們將緩存項(xiàng)的有效期單位從分鐘調(diào)整到秒。Illuminate\Cache\Repository
及其擴(kuò)展類的 put
、putMany
、add
、remember
和 setDefaultCacheTime
方法以及每個(gè)緩存存儲實(shí)現(xiàn)類的 put
方法對應(yīng)的有效期單位都做了這樣的調(diào)整。可以查看 相關(guān)的 PR 了解更多細(xì)節(jié)。
如果你的代碼中調(diào)用了上述方法,需要對相應(yīng)代碼進(jìn)行更新以確?,F(xiàn)在傳遞的有效期時(shí)間與之前一致(單位變成了秒,而不是之前的分鐘),作為替代方案,你還可以傳遞一個(gè) DateTime
實(shí)例來標(biāo)識緩存項(xiàng)的過期時(shí)間:
// Laravel 5.7 - 緩存30分鐘... Cache::put('foo', 'bar', 30); // Laravel 5.8 - 緩存30秒... Cache::put('foo', 'bar', 30); // Laravel 5.7 / 5.8 - 緩存30秒... Cache::put('foo', 'bar', now()->addSeconds(30));
多個(gè)廣播認(rèn)證看守器
在 Laravel 之前發(fā)行的版本中,私有和到場廣播頻道通過應(yīng)用的默認(rèn)認(rèn)證 guard 對用戶進(jìn)行認(rèn)證。從 Laravel 5.8 開始,你可以分配多個(gè) guard 來對請求進(jìn)行認(rèn)證:
Broadcast::channel('channel', function() { // ... }, ['guards' => ['web', 'admin']])
Token Guard 令牌哈希算法
Laravel 中提供基本 API 認(rèn)證的 token
guard,現(xiàn)在支持以 SHA-256 哈希算法對 API 令牌進(jìn)行存儲。這比存儲純文本令牌更加安全。要了解更多有關(guān)哈希令牌的細(xì)節(jié),請查閱完整的 API 認(rèn)證文檔。
注: 即便 Laravel 提供了一個(gè)關(guān)簡單的、基于令牌的認(rèn)證 guard ,考慮到健壯性和提供了 API 認(rèn)證的線上應(yīng)用,我們強(qiáng)烈推薦你使用 Laravel Passport 。
改進(jìn) Email 驗(yàn)證器
Laravel 5.8 采用了 SwiftMailer 的 egulias/email-validator
包,改進(jìn)了 email 驗(yàn)證器的驗(yàn)證邏輯。之前的 Laravel Email 驗(yàn)證邏輯認(rèn)為有效的郵件地址,比如 example@b?r.se
,現(xiàn)在可能會被判定無效。
默認(rèn)定時(shí)任務(wù)時(shí)區(qū)
Laravel 允許用戶使用 timezone
方法來自定義定時(shí)任務(wù)的時(shí)區(qū):
$schedule->command('inspire') ->hourly() ->timezone('America/Chicago');
如果你為每個(gè)定時(shí)任務(wù)都定義一個(gè)時(shí)區(qū)的話,這樣會比較繁瑣與麻煩。更簡便的方法是在 app/Console/Kernel.php
文件內(nèi)定義一個(gè) schedule Timezone
方法。這個(gè)方法將會把默認(rèn)時(shí)區(qū)返回給所有的定時(shí)任務(wù):
/** * 獲取默認(rèn)定時(shí)任務(wù)時(shí)區(qū)。 * * @return \DateTimeZone|string|null */ protected function scheduleTimezone() { return 'America/Chicago'; }
中間表 /pivot 模型事件
在之前版本的 Laravel 中,當(dāng)附著,分離或同自定義中間表 / 多對多關(guān)系的 “pivot” 模型時(shí) Eloquent 模型事件不會被派遣。在現(xiàn)在的 Laravel 5.8 中,使用 定制中間表模型 時(shí),這些事件都將被派遣。
Artisan 調(diào)用改進(jìn)
Laravel 允許你通過 Artisan::call
方法來調(diào)用 Artisan 。在之前發(fā)布的 Laravel 中,命令的選項(xiàng)是通過一個(gè)數(shù)組作為第二個(gè)參數(shù)來傳遞到方法中的:
use Illuminate\Support\Facades\Artisan; Artisan::call('migrate:install', ['database' => 'foo']);
然而,Laravel 5.8 允許你傳遞完整的命令,包括其選項(xiàng)。它將作為第一個(gè)字符串參數(shù)到方法中:
Artisan::call('migrate:install --database=foo');
Mock / Spy 測試輔助方法
為了創(chuàng)建模擬對象更加方便, 新的 mock
和 spy
方法已經(jīng)加入到基礎(chǔ) Laravel 測試用例中。這些方法自動的綁定模擬類到容器中。例如:
// Laravel 5.7 $this->instance(Service::class, Mockery::mock(Service::class, function ($mock) { $mock->shouldReceive('process')->once(); })); // Laravel 5.8 $this->mock(Service::class, function ($mock) { $mock->shouldReceive('process')->once(); });
Eloquent 資源鍵保持
當(dāng)從路由中返回 Eloquent 資源集合 時(shí), Laravel 會重置集合的鍵以使他們按簡單的數(shù)字順序排列:
use App\User; use App\Http\Resources\User as UserResource; Route::get('/user', function () { return UserResource::collection(User::all()); });
當(dāng)使用 Laravel 5.8 時(shí), 你可以添加一個(gè) preserveKeys
屬性到資源類表明資源類的鍵是否保留。默認(rèn)情況下,為了和之前版本的 Laravel 保持一致,這些鍵會被重置:
<?php namespace App\Http\Resources; use Illuminate\Http\Resources\Json\JsonResource; class User extends JsonResource { /** * Indicates if the resource's collection keys should be preserved. * * @var bool */ public $preserveKeys = true; }
當(dāng) preserveKeys
的屬性值設(shè)置為 true
時(shí), 集合鍵會被保留:
use App\User; use App\Http\Resources\User as UserResource; Route::get('/user', function () { return UserResource::collection(User::all()->keyBy->id); });
高階 orWhere
Eloquent 方法
在之前發(fā)布的 Laravel 中,通過 or
query 操作符來合并多個(gè) Eloquent 模型作用域須使用閉包回調(diào):
// scopePopular 和 scopeActive 方法定義在 User 模型中... $users = App\User::popular()->orWhere(function (Builder $query) { $query->active(); })->get();
Lavavel 5.8 引進(jìn)了 「高階」 orWhere
方法,使你可以不用閉包,從而實(shí)現(xiàn)對作用域的流暢鏈?zhǔn)秸{(diào)用。
$users = App\User::popular()->orWhere->active()->get();
Artisan Serve 改進(jìn)
在之前發(fā)布的 Laravel 中,Artisan 的 serve
方法會啟動你的應(yīng)用服務(wù),監(jiān)聽 8000
端口。 如果一個(gè) serve
命令進(jìn)程已經(jīng)啟動并占用了這個(gè)端口,那么通過 serve
命令嘗試啟動第二個(gè)應(yīng)用服務(wù)將會失敗。從 Laravel 5.8 起, serve
會掃描可用的端口直到 8009
,讓你可以同時(shí)啟動多個(gè)應(yīng)用服務(wù)。
模板文件映射
當(dāng)編譯 Blade 模板時(shí),Laravel 現(xiàn)在會在編譯文件的頂部添加注釋,其中包含原始 Blade 模板路徑。
DynamoDB 緩存 / Session 驅(qū)動
Laravel 5.8 引入了 DynamoDB 緩存和 session 驅(qū)動。DynamoDB 是 Amazon Web Services 提供的無服務(wù)器 NoSQL 數(shù)據(jù)庫。默認(rèn)的 dynamodb
緩存驅(qū)動配置可以在 Laravel 5.8 的 緩存配置文件 中找到。
Carbon 2.0 支持
Laravel 5.8 提供對 Carbon 日期處理庫 ~2.0
發(fā)行版本的支持。
Pheanstalk 4.0 支持
Laravel 5.8 提供對 Pheanstalk 隊(duì)列庫 ~4.0
發(fā)行版本的支持。如果你的應(yīng)用正在使用 Pheanstalk 庫,請通過 Composer 升級該庫到 ~4.0
發(fā)行版。