Laravel 5.8 在 Laravel 5.7 的基礎上繼續進行優化,包括引入新的 Eloquent 關聯關係(遠層一對一)、優化郵箱驗證、基於約定的受權策略類自動註冊、DynamoDB 緩存及 Session 驅動、優化任務調度器的時區配置、支持分配多個認證 guard 到廣播頻道、PSR-16緩存驅動規範、優化 artisan serve
命令、支持 PHPUnit 8.0、支持 Carbon 2.0、支持 Pheanstalk 4.0,以及多個 bug 修復和可用性的提高。php
HasOneThrough
關聯關係Eloquent 如今提供了對 HasOneThrough
關聯類型的支持。例如,假設 Supplier
模型類與 Account
模型類之間是一對一關聯,而且 Account
模型類與 AccountHistory
模型類之間也是一對一關聯,那麼咱們說 Supplier
模型類與 AccountHistory
模型類之間能夠經過 hasOneThrough
方法基於 Account
模型類創建遠層的一對一關聯:html
/** * Get the account history for the supplier. */ public function accountHistory() { return $this->hasOneThrough(AccountHistory::class, Account::class); }
在以前版本中,每一個模型類對應的受權策略類須要在應用的 AuthServiceProvider
中顯式註冊:laravel
/** * The policy mappings for the application. * * @var array */ protected $policies = [ 'App\User' => 'App\Policies\UserPolicy', ];
Laravel 5.8 引入了模型類對應策略類的自動發現機制,只要模型類和策略類遵循標準的 Laravel 命名約定(在約定的命名空間及對應目錄下)。也就是說,策略類都必須位於模型類所在目錄的子目錄 Policies
中,例如,若是模型類都位於 app
目錄下,則策略類必須位於 app/Policies
目錄下。此外,策略類的名稱必須和模型類相匹配,而且有一個 Policy
後綴,所以,User
模型類對應的策略類就是 UserPolicy
。git
若是你想要提供本身的策略類發現邏輯,可使用 Gate::guessPolicyNamesUsing
方法註冊自定義的回調。一般,該方法會在應用自帶的服務提供者類 AuthServiceProvider
中調用:github
use Illuminate\Support\Facades\Gate;web
Gate::guessPolicyNamesUsing(function ($modelClass) { // 返回相應的策略類名稱... });
注:任何顯式註冊在
AuthServiceProvider
中的模型映射策略類優先級高於這種自動發現獲取的策略類。算法
爲了在存儲緩存項時容許更細粒度的過時時間並遵照 PSR-16 緩存標準,咱們將緩存項的有效期單位從分鐘調整到秒。Illuminate\Cache\Repository
及其擴展類的 put
、putMany
、add
、remember
和 setDefaultCacheTime
方法以及每一個緩存存儲實現類的 put
方法對應的有效期單位都作了這樣的調整。能夠查看相關的PR瞭解更多細節。數據庫
若是你的代碼中調用了上述方法,須要對相應代碼進行更新以確保如今傳遞的有效期時間與以前一致(單位變成了秒,而不是以前的分鐘),做爲替代方案,你還能夠傳遞一個 DateTime
實例來標識緩存項的過時時間:數組
// 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));
在 Laravel 以前的版本中,私有和存在廣播頻道經過應用的默認認證 guard 對用戶進行認證。從 Laravel 5.8 開始,你能夠分配多個不一樣的 guard 來對請求進行認證:緩存
Broadcast::channel('channel', function() { // ... }, ['guards' => ['web', 'admin']])
Laravel 的 token
guard 用於提供最基本的 API 認證,如今支持以 SHA-256 哈希算法對 API 令牌進行存儲,這樣比存儲純文本令牌更加安全。想要了解更多關於哈希令牌的細節,能夠查看完整的 API 認證文檔。
注:當基於 Laravel 處理一個簡單的、基於令牌的認證 guard 時,強烈推薦使用 Laravel Passport,它更加健壯,適用於生產環境。
Laravel 5.8 經過 SwiftMailer 提供的 egulias/email-validator
擴展包對驗證器的底層郵箱驗證邏輯進行了優化。以前版本的郵箱驗證邏輯偶爾會將有效的郵箱地址,如 example@bär.se
斷定爲無效。
Laravel 容許你使用 timezone
方法自定義調度任務的時區:
$schedule->command('inspire') ->hourly() ->timezone('America/Chicago');
不過,當每一個調度任務的時區都同樣時這樣編寫代碼顯得笨重和累贅,所以,你如今能夠在 app/Console/Kernel.php
文件中定義一個 scheduleTimezone
方法,用來返回在全部調度任務中使用的默認時區:
/** * Get the timezone that should be used by default for scheduled events. * * @return \DateTimeZone|string|null */ protected function scheduleTimezone() { return 'America/Chicago'; }
Laravel 容許你經過 Artisan::call
方法調用 Artisan 命令,在以前發佈的版本中,命令的選項經過數組以第二個參數的方式傳遞到該方法:
use Illuminate\Support\Facades\Artisan; Artisan::call('migrate:install', ['database' => 'foo']);
然而,在 Laravel 5.8 中,你能夠傳遞整個命令,包括命令的選項,只需傳遞一個參數便可:
Artisan::call('migrate:install --database=foo');
爲了讓模擬對象更方便,Laravel 測試用例基類中新增了 mock
和 spy
方法,這兩個方法會自動綁定模擬類到容器中。例如:
// 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 資源集合時,Laravel 會重置集合的鍵以便它們以簡單的數字順序呈現:
use App\User; use App\Http\Resources\User as UserResource; Route::get('/user', function () { return UserResource::collection(User::all()); });
當使用 Laravel 5.8 時,你能夠添加一個 preserveKeys
屬性到資源類代表資源類的鍵是否保留。默認狀況下,爲了和以前版本的 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; }
而若是 preserveKeys
屬性值爲 true
時,集合鍵會被保留:
use App\User; use App\Http\Resources\User as UserResource; Route::get('/user', function () { return UserResource::collection(User::all()->keyBy->id); });
orWhere
在以前版本的 Laravel 中,經過 or 查詢操做符鏈接不一樣的 Eloquent 模型做用域時須要使用閉包回調:
// scopePopular and scopeActive methods defined on the User model... $users = App\User::popular()->orWhere(function (Builder $query) { $query->active(); })->get();
Laravel 5.8 引入了更高階的 orWhere
方法,容許你以方法鏈的方式連接做用域,而沒必要使用閉包:
$users = App\User::popular()->orWhere->active()->get();
在以前版本的 Laravel 中,Artisan 的 serve
命令會在 8000
端口上提供服務,若是有一個 serve
命令已經在監聽這個端口,則再次運行 artisan serve
命令會失敗。從 Laravel 5.8 開始,serve
會掃描從 8000
到 8009
之間的全部有效端口,以便你能夠一次運行多個 serve
命令。
編譯 Blade 模板時,Laravel 如今回添加一行註釋到編譯後文件的頂部,其中包含了編譯前 Blade 模板文件的路徑。
Laravel 5.8 引入了 DynamoDB 緩存和 Session 驅動,DynamoDB 是一個由 AWS 提供的無服務器 NoSQL 數據庫,dynamodb
緩存的默認配置能夠在 Laravel 5.8 的緩存配置文件中找到。
Laravel 5.8 提供了對日期操做庫 Carbon ~2.0
版本的支持。
Laravel 5.8 提供了對隊列庫 Pheanstalk ~4.0
版本的支持,若是你正在應用中使用 Pheanstalk 庫,請經過 Composer 升級這個庫到 ~4.0
版本。