Laravel 7發(fā)行說明
版本化方案
Laravel及官方發(fā)布的包皆遵循?語義版本化。主要框架版本每六個月發(fā)布一次 (~2月和~8月),而次要和補丁版本可能每周發(fā)布一次。次要版本和補丁?決不?包含非兼容性更改。
引入 Laravel 框架或其組件時,應始終使用版本約束,如?^7.0,因為 Laravel 的主要版本確實包含非兼容性更改。我們會努力確保您可以在一天或更短的時間內更新到最新版本。
支持政策
對于 LTS 版本,例如 Laravel 6,提供了 2 年的錯誤修復和3年的安全修復。這些版本提供了最長的支持和維護窗口。對于一般的發(fā)行版本,只提供了 6 個月的錯誤修復和 1 年的安全修復。對于包括 Lumen 在內的所有其他版本,只有最新版本才會修復錯誤。此外,請查閱?Laravel 支持的?數(shù)據(jù)庫版本。
Laravel 7
Laravel 7 通過引入 Laravel Sanctum,路由速度改進,自定義 Eloquent 強制轉換(casts), Blade 組件標簽,流暢的字符串操作,開發(fā)人員專用的 HTTP 客戶端, 第一方 CORS 支持, 路由模型綁定作用域改進, 存根自定義, 數(shù)據(jù)庫隊列改進, 多郵箱驅動, 查詢時間強制轉換(casts),新的?artisan test?命令,以及各種其他錯誤修復和可用性改進,對 Laravel 6.x 繼續(xù)進行了改善。
Laravel Sanctum
Laravel Sanctum 由?Taylor Otwell建造。
Laravel Sanctum 為 SPA (單頁應用程序),移動應用程序和基于令牌的簡單 API 提供了輕巧的身份驗證系統(tǒng)。 Sanctum 允許應用程序的每個用戶生成多個 API 令牌。 這些令牌可以被授予能力/作用域,用于指定允許令牌執(zhí)行哪些動作。
有關 Laravel Sanctum 的更多信息, 請查看?Sanctum 文檔。
自定義 Eloquent 類型轉換
自定義 Eloquent 類型轉換由?Taylor Otwell?開發(fā)貢獻.
Laravel 內置了多種常用的類型轉換。但是,用戶偶爾會需要將數(shù)據(jù)轉換成自定義類型。現(xiàn)在,該需求可以通過定義一個實現(xiàn)?CastsAttributes?接口的類來完成
實現(xiàn)了該接口的類必須事先定義一個?get?和?set?方法。?get?方法負責將從數(shù)據(jù)庫中獲取的原始數(shù)據(jù)轉換成對應的類型,而?set?方法則是將數(shù)據(jù)轉換成對應的數(shù)據(jù)庫類型以便存入數(shù)據(jù)庫中。舉個例子,下面我們將內置的?json?類型轉換以自定義類型轉換的形式重新實現(xiàn)一遍:
namespace App\Casts;
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
class Json implements CastsAttributes
{
/**
* 將取出的數(shù)據(jù)進行轉換
*
* @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);
}
}
定義好自定義類型轉換后,可以使用其類名稱將其附加到模型屬性:
namespace App;
use App\Casts\Json;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* 這個屬性應該被轉化為原生類型
*
* @var array
*/
protected $casts = [
'options' => Json::class,
];
}
要學習如何實現(xiàn)自定義 Eloquent 類型轉換,包括轉換成特定值對象的類型轉換,請參照?Eloquent documentation。
Blade 組件標簽和變化
Blade 組件標簽貢獻人員有?Spatie,?Marcel Pociot,?Caleb Porzio,?Dries Vints, 和?Taylor Otwell.
{小提示} Blade 組件已經大刀闊斧修改,其中變化有允許基于標簽的渲染,參數(shù)管理,組件類,內聯(lián)視圖組件眾多變化。經過修改的 Blade 組件如此之多,請從這里?Blade文檔來學習這些新特性。
總結為一句,現(xiàn)在的一個組件能從指定的類獲取數(shù)據(jù)。所有的公開屬性和方法都清晰地定義在組件類里,會自動組裝成組件視圖。任何附加的 HTML 屬性都指定于一個可以被管理的自動包含$attribute?變量的組件,它是一個屬性包的實例。
下面有個例子,我們會假設一個?App\View\Components\Alert?組件定義是這樣的:
namespace App\View\Components;
use Illuminate\View\Component;
class Alert extends Component
{
/**
* 提醒類型
*
* @var string
*/
public $type;
/**
* 創(chuàng)建組件實例.
*
* @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 組件模板定義是這樣的:
{{ $heading }}
{{ $slot }}
組件可以被渲染在另一個使用組件標簽的 Blade 視圖:
Alert content...
Default slot content...
如前所述,在大改之后的 Laravel7 當中這是一個非常小又普通的一個功能,而且還沒有演示匿名組件,內聯(lián)視圖組件和各種各樣的其他特性。請從這里Blade文檔來學習這些新特性
{注意} 以前的 Blade 組件?@component?語法沒有被移除。
HTTP 客戶端
HTTP 客戶端是 Guzzle 的一個封裝,由?Adam Wathan,Jason McCreary,和?Taylor Otwell?提供。
Laravel 現(xiàn)在提供一套圍繞 Guzzle HTTP 客戶端](http://docs.guzzlephp.org/en/stable/) 構建的精簡且高效的 API,允許你快速向其它 web 應用發(fā)起 HTTP 請求。Laravel 基于 Guzzle 的封裝專注于最常見的用例和最棒的開發(fā)人員體驗。例如,客戶端發(fā)起帶 JSON 數(shù)據(jù)的?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?開發(fā)貢獻?。
你可能對 Laravel 已有的?Illuminate\Support\Str?這個類比較熟悉,它提供了各種有用的字符串操作函數(shù)。基于這些函數(shù), Laravel 7 現(xiàn)在提供了一個更加面向對象的、更加流暢的字符串操作庫。你可以使用?Str::of?方法創(chuàng)建一個?Illuminate\Support\Stringable?對象。 然后可以使用該對象的各種方法去操作字符串:
return (string) Str::of(' Laravel Framework 6.x ')
->trim()
->replace('6.x', '7.x')
->slug();
有關流暢的字符串操作可用方法的更多信息, 請查閱完整文檔。
路由模型綁定優(yōu)化
路由模型綁定優(yōu)化由?Taylor Otwell?開發(fā)貢獻?。
自定義鍵名
有時你可能希望使用?id?以外的字段來解析 Eloquent 模型。 為此, Laravel 7 允許你在路由參數(shù)中指定某個字段:
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;
});
當使用自定義鍵隱式綁定作為嵌套的路由參數(shù)時,Laravel 7 將自動確定查詢范圍,以使用約定猜測其父級上的關系名稱,以其父級檢索嵌套模型。在這種情況下,將假定?User?模型關聯(lián)了名為?posts(路由參數(shù)名稱的復數(shù)) 的關系,該關系可用于檢索?Post?模型。
有關路由模型綁定的更多信息,請查閱路由文檔。
多郵件驅動程序
多郵件驅動程序支持由?Taylor Otwell?貢獻。
Laravel 7 允許為單個應用配置多個郵件驅動。在?mail?配置文件中的每個郵件驅動都擁有它們自己的配置以及自己獨特的 「transport」,這允許你的應用使用不同的郵件服務來發(fā)送某些郵件。例如,你的應用可以使用 Postmark 發(fā)送批量郵件,使用 Amazon SES 發(fā)送公務郵件。
默認情況下,Laravel 將使用?mail?配置文件中的?default?選項指定的郵件驅動作為郵件驅動。然而,你可以通過?mailer?方法來使用特定的郵件驅動來發(fā)送郵件。
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?開發(fā)貢獻.
有時候需要在查詢執(zhí)行過程中對特定屬性進行類型轉換,例如需要從數(shù)據(jù)庫表中獲取數(shù)據(jù)的時候。舉個例子,請參考以下查詢:
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?屬性將會是一個字符串。假如我們在執(zhí)行查詢時進行?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+ 數(shù)據(jù)庫隊列改進
MySQL 數(shù)據(jù)庫隊列改進由?Mohamed Said?開發(fā)貢獻.
在先前版本的 Laravel 中,?database?隊列的健壯性被認為無法滿足生產環(huán)境的需求。但是,Laravel 7 針對使用基于 MySQL 8+ 數(shù)據(jù)庫隊列的應用進行了改進。通過使用?FOR UPDATE SKIP LOCKED?語句進行 SQL 的優(yōu)化,database?隊列驅動可以安全地用于生產環(huán)境。
Artisan?test?命令
test?命令由?Nuno Maduro?貢獻
除了?phpunit命令之外,現(xiàn)在可以使用?test?Artisan 命令來運行測試。 Artisan 測試運行器提供了漂亮的控制臺,以及有關當前正在運行的測試的更多信息。 此外,運行器將在第一次測試失敗時自動停止:
php artisan test
可以傳遞給?phpunit?命令的任何參數(shù)也可以傳遞給 Artisan?test?命令:
php artisan test --group=feature
Markdown 郵件模板改進
Markdown 郵件模板改進由?Taylor Otwell?貢獻
默認的Markdown郵件模板已基于Tailwind CSS調色板做出全新、更現(xiàn)代的設計。 當然,可以根據(jù)您的應用程序的需求來發(fā)布和定制此模板:
有關 Markdown 郵件的更多信息,請查看郵件發(fā)送.
自定義樁代碼
自定義樁代碼由?Taylor Otwell貢獻
Artisan 控制臺的 make 命令用于創(chuàng)建各種類,例如控制器,任務,遷移和測試。 這些類是根據(jù)輸入填充值使用「樁代碼」生成文件的。 但是,有時可能希望對 Artisan 生成的文件進行小的更改。 為此,Laravel 7提供了?stub:publish?命令來發(fā)布最常見的自定義樁代碼:
php artisan stub:publish
發(fā)布的樁代碼將位于應用程序根目錄中的?stubs?目錄中。 當使用 Artisan 的 make 命令生成它們的相應類時,對這些樁代碼所做的任何更改都會反映出來。
隊列maxExceptions配置
maxExceptions屬性由Mohamed Said提交貢獻.
有時可能希望指定可以嘗試多次的任務,但是如果重試是由給定數(shù)量的異常觸發(fā)的,則該任務將失敗。在Laravel7中,可以在任務類上定義?maxExceptions?屬性:
namespace App\Jobs;
class ProcessPodcast implements ShouldQueue
{
/**
* 任務可以被重試的次數(shù)。
*
* @var int
*/
public $tries = 25;
/**
* 失敗之前允許拋出異常的最大次數(shù)。
*
* @var int
*/
public $maxExceptions = 3;
/**
* 執(zhí)行任務。
*
* @return void
*/
public function handle()
{
Redis::throttle('key')->allow(10)->every(60)->then(function () {
// 獲取鎖,處理博客進程...
}, function () {
// 無法獲取鎖...
return $this->release(10);
});
}
}
在此示例中,如果應用程序無法獲得 Redis 鎖,則該任務將釋放十秒鐘,并將繼續(xù)重試 25 次。但是,如果任務拋出三個未處理的異常,則該任務將失敗。
Laravel NAT
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。