laravel5.8新特效

laravel5.8新特效

 

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

Eloquent 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 模型類對應的策略類就是 UserPolicygit

若是你想要提供本身的策略類發現邏輯,可使用 Gate::guessPolicyNamesUsing 方法註冊自定義的回調。一般,該方法會在應用自帶的服務提供者類 AuthServiceProvider 中調用:github

use Illuminate\Support\Facades\Gate;web

Gate::guessPolicyNamesUsing(function ($modelClass) {
    // 返回相應的策略類名稱...
});

注:任何顯式註冊在 AuthServiceProvider 中的模型映射策略類優先級高於這種自動發現獲取的策略類。算法

PSR-16 緩存規範

爲了在存儲緩存項時容許更細粒度的過時時間並遵照 PSR-16 緩存標準,咱們將緩存項的有效期單位從分鐘調整到秒。Illuminate\Cache\Repository 及其擴展類的 putputManyaddremember 和 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));

多個廣播認證 Guard

在 Laravel 以前的版本中,私有和存在廣播頻道經過應用的默認認證 guard 對用戶進行認證。從 Laravel 5.8 開始,你能夠分配多個不一樣的 guard 來對請求進行認證:緩存

Broadcast::channel('channel', function() {
    // ...
}, ['guards' => ['web', 'admin']])

Token Guard 令牌哈希算法

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';
}

Artisan 調用優化

Laravel 容許你經過 Artisan::call 方法調用 Artisan 命令,在以前發佈的版本中,命令的選項經過數組以第二個參數的方式傳遞到該方法:

use Illuminate\Support\Facades\Artisan;

Artisan::call('migrate:install', ['database' => 'foo']);

然而,在 Laravel 5.8 中,你能夠傳遞整個命令,包括命令的選項,只需傳遞一個參數便可:

Artisan::call('migrate:install --database=foo');

測試輔助方法 mock/spy

爲了讓模擬對象更方便,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 資源鍵保留

當從路由中返回一個 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);
});

更高階的 Eloquent 方法 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();

Artisan Serve 命令優化

在以前版本的 Laravel 中,Artisan 的 serve 命令會在 8000 端口上提供服務,若是有一個 serve 命令已經在監聽這個端口,則再次運行 artisan serve 命令會失敗。從 Laravel 5.8 開始,serve 會掃描從 8000 到 8009 之間的全部有效端口,以便你能夠一次運行多個 serve 命令。

Blade 文件映射

編譯 Blade 模板時,Laravel 如今回添加一行註釋到編譯後文件的頂部,其中包含了編譯前 Blade 模板文件的路徑。

DynamoDB 緩存/Session 驅動

Laravel 5.8 引入了 DynamoDB 緩存和 Session 驅動,DynamoDB 是一個由 AWS 提供的無服務器 NoSQL 數據庫,dynamodb 緩存的默認配置能夠在 Laravel 5.8 的緩存配置文件中找到。

支持 Carbon 2.0

Laravel 5.8 提供了對日期操做庫 Carbon ~2.0 版本的支持。

支持 Pheanstalk 4.0

Laravel 5.8 提供了對隊列庫 Pheanstalk ~4.0 版本的支持,若是你正在應用中使用 Pheanstalk 庫,請經過 Composer 升級這個庫到 ~4.0 版本。

相關文章
相關標籤/搜索