Laravel 7发行说明
版本化方案
Laravel及官方發布的包皆遵循?語義版本化。主要框架版本每六個月發布一次 (~2月和~8月),而次要和補丁版本可能每周發布一次。次要版本和補丁?決不?包含非兼容性更改。
引入 Laravel 框架或其組件時,應始終使用版本約束,如?^7.0,因為 Laravel 的主要版本確實包含非兼容性更改。我們會努力確保您可以在一天或更短的時間內更新到最新版本。
支持政策
對于 LTS 版本,例如 Laravel 6,提供了 2 年的錯誤修復和3年的安全修復。這些版本提供了最長的支持和維護窗口。對于一般的發行版本,只提供了 6 個月的錯誤修復和 1 年的安全修復。對于包括 Lumen 在內的所有其他版本,只有最新版本才會修復錯誤。此外,請查閱?Laravel 支持的?數據庫版本。
| 版本 | 發布時間 | Bug 修復截止時間 | 安全修復截止時間 |
|---|---|---|---|
| 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 日 |
| 6 (LTS) | 2019 年 9 月 3 日 | 2021 年 9 月 3 日 | 2022 年 9 月 3 日 |
| 7 | 2020 年 3 月 3 日 | 2020 年 9 月 3 日 | 2021 年 3 月 3 日 |
Laravel 7
Laravel 7 通過引入 Laravel Sanctum,路由速度改進,自定義 Eloquent 強制轉換(casts), Blade 組件標簽,流暢的字符串操作,開發人員專用的 HTTP 客戶端, 第一方 CORS 支持, 路由模型綁定作用域改進, 存根自定義, 數據庫隊列改進, 多郵箱驅動, 查詢時間強制轉換(casts),新的?artisan test?命令,以及各種其他錯誤修復和可用性改進,對 Laravel 6.x 繼續進行了改善。
Laravel Sanctum
Laravel Sanctum 由?Taylor Otwell建造。
Laravel Sanctum 為 SPA (單頁應用程序),移動應用程序和基于令牌的簡單 API 提供了輕巧的身份驗證系統。 Sanctum 允許應用程序的每個用戶生成多個 API 令牌。 這些令牌可以被授予能力/作用域,用于指定允許令牌執行哪些動作。
有關 Laravel Sanctum 的更多信息, 請查看?Sanctum 文檔。
自定義 Eloquent 類型轉換
自定義 Eloquent 類型轉換由?Taylor Otwell?開發貢獻.
Laravel 內置了多種常用的類型轉換。但是,用戶偶爾會需要將數據轉換成自定義類型。現在,該需求可以通過定義一個實現?CastsAttributes?接口的類來完成
實現了該接口的類必須事先定義一個?get?和?set?方法。?get?方法負責將從數據庫中獲取的原始數據轉換成對應的類型,而?set?方法則是將數據轉換成對應的數據庫類型以便存入數據庫中。舉個例子,下面我們將內置的?json?類型轉換以自定義類型轉換的形式重新實現一遍:
<?phpnamespace App\Casts;use Illuminate\Contracts\Database\Eloquent\CastsAttributes;class Json implements CastsAttributes
{/*** 將取出的數據進行轉換** @param \Illuminate\Database\Eloquent\Model $model* @param string $key* @param mixed $value* @param array $attributes* @return array*/public function get($model, $key, $value, $attributes){return json_decode($value, true);}/*** 轉換成將要進行存儲的值** @param \Illuminate\Database\Eloquent\Model $model* @param string $key* @param array $value* @param array $attributes* @return string*/public function set($model, $key, $value, $attributes){return json_encode($value);}
}
定義好自定義類型轉換后,可以使用其類名稱將其附加到模型屬性:
<?phpnamespace App;use App\Casts\Json;
use Illuminate\Database\Eloquent\Model;class User extends Model
{/*** 這個屬性應該被轉化為原生類型** @var array*/protected $casts = ['options' => Json::class,];
}
要學習如何實現自定義 Eloquent 類型轉換,包括轉換成特定值對象的類型轉換,請參照?Eloquent documentation。
Blade 組件標簽和變化
Blade 組件標簽貢獻人員有?Spatie,?Marcel Pociot,?Caleb Porzio,?Dries Vints, 和?Taylor Otwell.
{小提示} Blade 組件已經大刀闊斧修改,其中變化有允許基于標簽的渲染,參數管理,組件類,內聯視圖組件眾多變化。經過修改的 Blade 組件如此之多,請從這里?Blade文檔來學習這些新特性。
總結為一句,現在的一個組件能從指定的類獲取數據。所有的公開屬性和方法都清晰地定義在組件類里,會自動組裝成組件視圖。任何附加的 HTML 屬性都指定于一個可以被管理的自動包含$attribute?變量的組件,它是一個屬性包的實例。
下面有個例子,我們會假設一個?App\View\Components\Alert?組件定義是這樣的:
<?phpnamespace App\View\Components;use Illuminate\View\Component;class Alert extends Component
{/*** 提醒類型** @var string*/public $type;/*** 創建組件實例.** @param string $type* @return void*/public function __construct($type){$this->type = $type;}/***獲取給提醒類型的類 ** @return string*/public function classForType(){return $this->type == 'danger' ? 'alert-danger' : 'alert-warning';}/*** 獲取渲染組件的視圖/內容** @return \Illuminate\View\View|string*/public function render(){return view('components.alert');}
}
并且假設 Blade 組件模板定義是這樣的:
<!-- /resources/views/components/alert.blade.php --><div class="alert {{ $classForType() }}" {{ $attributes }}>{{ $heading }}{{ $slot }}
</div>
組件可以被渲染在另一個使用組件標簽的 Blade 視圖:
<x-alert type="error" class="mb-4"><x-slot name="heading">Alert content...</x-slot>Default slot content...
</x-alert>
如前所述,在大改之后的 Laravel7 當中這是一個非常小又普通的一個功能,而且還沒有演示匿名組件,內聯視圖組件和各種各樣的其他特性。請從這里Blade文檔來學習這些新特性
{注意} 以前的 Blade 組件?
@component?語法沒有被移除。
HTTP 客戶端
HTTP 客戶端是 Guzzle 的一個封裝,由?Adam Wathan,Jason McCreary,和?Taylor Otwell?提供。
Laravel 現在提供一套圍繞 Guzzle HTTP 客戶端](http://docs.guzzlephp.org/en/stable/) 構建的精簡且高效的 API,允許你快速向其它 web 應用發起 HTTP 請求。Laravel 基于 Guzzle 的封裝專注于最常見的用例和最棒的開發人員體驗。例如,客戶端發起帶 JSON 數據的?POST?請求變得輕而易舉:
use Illuminate\Support\Facades\Http;$response = Http::withHeaders(['X-First' => 'foo''X-Second' => 'bar'
])->post('http://test.com/users', ['name' => 'Taylor',
]);return $response['id'];
此外,HTTP 客戶端還提供了令人驚嘆且易于使用的測試功能:
Http::fake([// Stub a JSON response for GitHub endpoints...'github.com/*' => Http::response(['foo' => 'bar'], 200, ['Headers']),// Stub a string response for Google endpoints...'google.com/*' => Http::response('Hello World', 200, ['Headers']),// Stub a series of responses for Facebook endpoints...'facebook.com/*' => Http::sequence()->push('Hello World', 200)->push(['foo' => 'bar'], 200)->pushStatus(404),
]);
了解更多 HTTP 客戶端的特性,請查閱?HTTP 客戶端文檔.
流暢的字符串操作
流暢的字符串操作由?Taylor Otwell?開發貢獻?。
你可能對 Laravel 已有的?Illuminate\Support\Str?這個類比較熟悉,它提供了各種有用的字符串操作函數。基于這些函數, Laravel 7 現在提供了一個更加面向對象的、更加流暢的字符串操作庫。你可以使用?Str::of?方法創建一個?Illuminate\Support\Stringable?對象。 然后可以使用該對象的各種方法去操作字符串:
return (string) Str::of(' Laravel Framework 6.x ')->trim()->replace('6.x', '7.x')->slug();
有關流暢的字符串操作可用方法的更多信息, 請查閱完整文檔。
路由模型綁定優化
路由模型綁定優化由?Taylor Otwell?開發貢獻?。
自定義鍵名
有時你可能希望使用?id?以外的字段來解析 Eloquent 模型。 為此, Laravel 7 允許你在路由參數中指定某個字段:
Route::get('api/posts/{post:slug}', function (App\Post $post) {return $post;
});
隱式綁定約束
有時,當在路由中隱式綁定多個 Eloquent 模型時,可能希望對第二個 Eloquent 模型進行約束,使其必須是第一個 Eloquent 模型的子類。例如,考慮這種情況,該情況是通過 Slug 為特定用戶查找博客文章的:
use App\Post;
use App\User;Route::get('api/users/{user}/posts/{post:slug}', function (User $user, Post $post) {return $post;
});
當使用自定義鍵隱式綁定作為嵌套的路由參數時,Laravel 7 將自動確定查詢范圍,以使用約定猜測其父級上的關系名稱,以其父級檢索嵌套模型。在這種情況下,將假定?User?模型關聯了名為?posts(路由參數名稱的復數) 的關系,該關系可用于檢索?Post?模型。
有關路由模型綁定的更多信息,請查閱路由文檔。
多郵件驅動程序
多郵件驅動程序支持由?Taylor Otwell?貢獻。
Laravel 7 允許為單個應用配置多個郵件驅動。在?mail?配置文件中的每個郵件驅動都擁有它們自己的配置以及自己獨特的 「transport」,這允許你的應用使用不同的郵件服務來發送某些郵件。例如,你的應用可以使用 Postmark 發送批量郵件,使用 Amazon SES 發送公務郵件。
默認情況下,Laravel 將使用?mail?配置文件中的?default?選項指定的郵件驅動作為郵件驅動。然而,你可以通過?mailer?方法來使用特定的郵件驅動來發送郵件。
Mail::mailer('postmark')->to($request->user())->send(new OrderShipped($order));
路由緩存速度改進
路由緩存速度改進由上游的?Symfony?的貢獻者和?Dries Vints?貢獻
Laravel 7 提供了一種新的方法,用于匹配使用 Artisan 命令?route:cache?緩存的已編譯緩存路由。在大型應用程序(例如,具有800條或更多路由的應用程序)上,這些改進可以使簡單的「Hello World」基準測試每秒的請求速度?提高2倍?,而無需更改應用程序。
CORS 支持
CORS 支持由?Barry vd. Heuvel?貢獻
Laravel 7 通過集成由 Barry vd. Heuvel 編寫的受歡迎的 Laravel CORS 軟件包,為配置跨域資源共享(CORS)?OPTIONS?請求響應提供了官方支持,?默認的 Laravel 應用程序框架?中包含一個新的?cors?配置。
有關 Laravel 7.x 中的 CORS 支持的更多信息,請查閱CORS文檔。
查詢時類型轉換
查詢時類型轉換由?Matt Barlow?開發貢獻.
有時候需要在查詢執行過程中對特定屬性進行類型轉換,例如需要從數據庫表中獲取數據的時候。舉個例子,請參考以下查詢:
use App\Post;
use App\User;$users = User::select(['users.*','last_posted_at' => Post::selectRaw('MAX(created_at)')->whereColumn('user_id', 'users.id')
])->get();
在該查詢獲取到的結果集中,last_posted_at?屬性將會是一個字符串。假如我們在執行查詢時進行?date?類型轉換將更方便。你可以通過使用?withCasts?方法來完成上述操作:
$users = User::select(['users.*','last_posted_at' => Post::selectRaw('MAX(created_at)')->whereColumn('user_id', 'users.id')
])->withCasts(['last_posted_at' => 'date'
])->get();
MySQL 8+ 數據庫隊列改進
MySQL 數據庫隊列改進由?Mohamed Said?開發貢獻.
在先前版本的 Laravel 中,?database?隊列的健壯性被認為無法滿足生產環境的需求。但是,Laravel 7 針對使用基于 MySQL 8+ 數據庫隊列的應用進行了改進。通過使用?FOR UPDATE SKIP LOCKED?語句進行 SQL 的優化,database?隊列驅動可以安全地用于生產環境。
Artisan?test?命令
test?命令由?Nuno Maduro?貢獻
除了?phpunit命令之外,現在可以使用?test?Artisan 命令來運行測試。 Artisan 測試運行器提供了漂亮的控制臺,以及有關當前正在運行的測試的更多信息。 此外,運行器將在第一次測試失敗時自動停止:
php artisan test
可以傳遞給?phpunit?命令的任何參數也可以傳遞給 Artisan?test?命令:
php artisan test --group=feature
Markdown 郵件模板改進
Markdown 郵件模板改進由?Taylor Otwell?貢獻
默認的Markdown郵件模板已基于Tailwind CSS調色板做出全新、更現代的設計。 當然,可以根據您的應用程序的需求來發布和定制此模板:
?
有關 Markdown 郵件的更多信息,請查看郵件發送.
自定義樁代碼
自定義樁代碼由?Taylor Otwell貢獻
Artisan 控制臺的 make 命令用于創建各種類,例如控制器,任務,遷移和測試。 這些類是根據輸入填充值使用「樁代碼」生成文件的。 但是,有時可能希望對 Artisan 生成的文件進行小的更改。 為此,Laravel 7提供了?stub:publish?命令來發布最常見的自定義樁代碼:
php artisan stub:publish
發布的樁代碼將位于應用程序根目錄中的?stubs?目錄中。 當使用 Artisan 的 make 命令生成它們的相應類時,對這些樁代碼所做的任何更改都會反映出來。
隊列maxExceptions配置
maxExceptions屬性由Mohamed Said提交貢獻.
有時可能希望指定可以嘗試多次的任務,但是如果重試是由給定數量的異常觸發的,則該任務將失敗。在Laravel7中,可以在任務類上定義?maxExceptions?屬性:
<?phpnamespace App\Jobs;class ProcessPodcast implements ShouldQueue
{/*** 任務可以被重試的次數。** @var int*/public $tries = 25;/*** 失敗之前允許拋出異常的最大次數。** @var int*/public $maxExceptions = 3;/*** 執行任務。** @return void*/public function handle(){Redis::throttle('key')->allow(10)->every(60)->then(function () {// 獲取鎖,處理博客進程...}, function () {// 無法獲取鎖...return $this->release(10);});}
}
在此示例中,如果應用程序無法獲得 Redis 鎖,則該任務將釋放十秒鐘,并將繼續重試 25 次。但是,如果任務拋出三個未處理的異常,則該任務將失敗。
總結
以上是生活随笔為你收集整理的Laravel 7发行说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 依赖注入?依赖注入是如何实现解耦的?
- 下一篇: 微信支付案例