php 6.0新特性,新版特性 | 序言 | Laravel 6 中文文档
新版特性
由 學(xué)院君 創(chuàng)建于1年前, 最后更新于 1年前
版本號(hào) #2
17909 views
7 likes
2 collects
Laravel 6.0(LTS 版本) 在 Laravel 5.8 的基礎(chǔ)上繼續(xù)進(jìn)行優(yōu)化,包括引入語(yǔ)義化版本、兼容 Laravel Vapor、優(yōu)化授權(quán)響應(yīng)、支持任務(wù)中間件、新增懶集合、優(yōu)化數(shù)據(jù)庫(kù)子查詢、將前端腳手架提取到獨(dú)立的 Composer 包 laravel/ui、以及多個(gè) bug 修復(fù)和可用性的提升。
語(yǔ)義化版本
Laravel 框架包 laravel/framework 現(xiàn)在遵循語(yǔ)義化版本標(biāo)準(zhǔn)。這使得框架得以和其他已經(jīng)遵循該版本標(biāo)準(zhǔn)的 Laravel 擴(kuò)展包保持一致,不過(guò) Laravel 的發(fā)布周期將保持不變。
兼容 Laravel Vapor
Laravel 6.0 提供了對(duì) Laravel Vapor 的兼容,這是一個(gè)針對(duì) Laravel 應(yīng)用的自動(dòng)擴(kuò)容無(wú)服務(wù)器部署平臺(tái)。Vapor 對(duì)在 AWS Lambda 上管理 Laravel 應(yīng)用以及與 SQS 隊(duì)列、數(shù)據(jù)庫(kù)、Redis 集群、網(wǎng)絡(luò)、CloudFront CDN 進(jìn)行交互的復(fù)雜性進(jìn)行了抽象。
通過(guò) Ignition 優(yōu)化異常
Laravel 6.0 支持 Ignition,這個(gè)一個(gè)開源的錯(cuò)誤和異常詳情頁(yè)項(xiàng)目,由 Freek Van der Herten 和 Marcel Pociot 創(chuàng)建并維護(hù)。相對(duì)于之前版本的錯(cuò)誤顯示,Ignition 提供了諸多便捷之處,比如優(yōu)化了 Blade 錯(cuò)誤文件和行號(hào)處理、針對(duì)常見(jiàn)問(wèn)題的可執(zhí)行解決方案、代碼編輯、異常分享、以及經(jīng)過(guò)優(yōu)化的用戶體驗(yàn)。
優(yōu)化授權(quán)響應(yīng)
在之前版本的 Laravel 中,獲取并提供自定義授權(quán)消息給終端用戶很困難,主要難點(diǎn)在于如何向終端用戶解釋清楚為什么特定的請(qǐng)求被拒絕了。在 Laravel 6.0 中,我們可以使用 Gate::inspect 方法和授權(quán)響應(yīng)消息來(lái)輕松實(shí)現(xiàn)。例如,給定如下策略方法:
/**
* 判斷用戶是否可以查看指定的航班.
*
* @param \App\User $user
* @param \App\Flight $flight
* @return mixed
*/
public function view(User $user, Flight $flight)
{
return $this->deny('Explanation of denial.');
}
接下來(lái)我們可以通過(guò) Gate::inspect 方法獲取授權(quán)策略的響應(yīng),然后再通過(guò)響應(yīng)示例的 message() 方法獲取授權(quán)消息:
$response = Gate::inspect('view', $flight);
if ($response->allowed()) {
// 用戶被授權(quán)可以訪問(wèn)航班...
}
if ($response->denied()) {
echo $response->message();
}
此外,當(dāng)在路由或控制器中使用 $this->authorize 或者 Gate::authorize 方法時(shí),這些自定義的消息會(huì)被自動(dòng)返回給前端。
任務(wù)中間件
任務(wù)中間件允許你封裝自定義的隊(duì)列任務(wù)異常業(yè)務(wù)邏輯,避免在任務(wù)自身處理中混入對(duì)應(yīng)樣板代碼。例如,在之前的 Laravel 版本中,你可能需要在頻率限制回調(diào)中封裝某個(gè)任務(wù)的 handle 方法處理邏輯:
/**
* 執(zhí)行任務(wù)
*
* @return void
*/
public function handle()
{
Redis::throttle('key')->block(0)->allow(1)->every(5)->then(function () {
info('Lock obtained...');
// 處理任務(wù)...
}, function () {
// 無(wú)法獲取到鎖...
return $this->release(5);
});
}
而在 Laravel 6.0 中,該業(yè)務(wù)邏輯可以被提取到任務(wù)中間件中,從而將你的任務(wù) handle 方法從頻率限制中解放出來(lái):
namespace App\Jobs\Middleware;
use Illuminate\Support\Facades\Redis;
class RateLimited
{
/**
* 處理隊(duì)列任務(wù).
*
* @param mixed $job
* @param callable $next
* @return mixed
*/
public function handle($job, $next)
{
Redis::throttle('key')
->block(0)->allow(1)->every(5)
->then(function () use ($job, $next) {
// Lock obtained...
$next($job);
}, function () use ($job) {
// Could not obtain lock...
$job->release(5);
});
}
}
創(chuàng)建完中間件后,可以通過(guò)在任務(wù)類的 middleware 方法中返回中間件數(shù)組來(lái)將其追加到隊(duì)列任務(wù)中:
use App\Jobs\Middleware\RateLimited;
/**
* Get the middleware the job should pass through.
*
* @return array
*/
public function middleware()
{
return [new RateLimited];
}
懶集合
許多開發(fā)者已經(jīng)使用過(guò) Laravel 功能強(qiáng)大的集合方法了,在 Laravel 6.0 中新引入了一個(gè) LazyCollection 類來(lái)對(duì) Collection 類進(jìn)行補(bǔ)充,LazyCollection 底層基于 PHP 的生成器實(shí)現(xiàn),適用于處理大型數(shù)據(jù)集。
例如,假設(shè)你的應(yīng)用需要處理 GB 級(jí)別的日志文件,并使用 Laravel 的集合方法來(lái)解析日志,這個(gè)時(shí)候?qū)⒄麄€(gè)日志文件一次性讀取到內(nèi)存顯然是不合適的,這個(gè)時(shí)候懶集合類就派上用場(chǎng)了,它可以每次只讀取文件的一小部分到內(nèi)存:
use App\LogEntry;
use Illuminate\Support\LazyCollection;
LazyCollection::make(function () {
$handle = fopen('log.txt', 'r');
while (($line = fgets($handle)) !== false) {
yield $line;
}
})
->chunk(4)
->map(function ($lines) {
return LogEntry::fromLines($lines);
})
->each(function (LogEntry $logEntry) {
// Process the log entry...
});
或者,假設(shè)你需要迭代 10000 個(gè) Eloquent 模型實(shí)例,如果使用傳統(tǒng)的 Laravel 集合,所有 10000 個(gè) Eloquent 模型會(huì)同時(shí)加載到內(nèi)存中:
$users = App\User::all()->filter(function ($user) {
return $user->id > 500;
});
不過(guò),從 Laravel 6.0 開始,查詢構(gòu)建器的 cursor 方法已經(jīng)被升級(jí)為返回 LazyCollection 實(shí)例,這樣一來(lái),我們就可以像之前一樣執(zhí)行一次數(shù)據(jù)庫(kù)查詢,但是每次只會(huì)加載一個(gè) Eloquent 模型到內(nèi)存。在這個(gè)示例中,filter 回調(diào)只有在迭代完每個(gè)用戶時(shí)才會(huì)執(zhí)行,從而極大減少內(nèi)存的使用量:
$users = App\User::cursor()->filter(function ($user) {
return $user->id > 500;
});
foreach ($users as $user) {
echo $user->id;
}
Eloquent 子查詢優(yōu)化
Laravel 6.0 引入了多個(gè)數(shù)據(jù)庫(kù)子查詢優(yōu)化和增強(qiáng)支持。例如,假設(shè)我們有一個(gè)航班目的地表 destinations 和飛向這些目的地的航班表 flights,flights 表包含了一個(gè) arrived_at 字段來(lái)表示航班到達(dá)目的地的時(shí)間。
使用 Laravel 6.0 提供的新的子查詢功能,我們可以通過(guò)一個(gè)查詢獲取所有的航班目的地以及最新到達(dá)這些目的地的航班名稱:
return Destination::addSelect(['last_flight' => Flight::select('name')
->whereColumn('destination_id', 'destinations.id')
->orderBy('arrived_at', 'desc')
->limit(1)
])->get();
此外,我們還可以使用查詢構(gòu)建器方法 orderBy 添加的新的子查詢方法基于到達(dá)目的地的最晚航班到達(dá)時(shí)間對(duì)所有航班目的地進(jìn)行排序,同樣,這也可以通過(guò)一次數(shù)據(jù)庫(kù)查詢完成:
return Destination::orderByDesc(
Flight::select('arrived_at')
->whereColumn('destination_id', 'destinations.id')
->orderBy('arrived_at', 'desc')
->limit(1)
)->get();
Laravel UI
之前版本 Laravel 提供的典型的前端腳手架代碼現(xiàn)在被提取到獨(dú)立的 Composer 擴(kuò)展包 laravel/ui 中,這樣一來(lái)可以讓 UI 腳手架代碼的開發(fā)和維護(hù)與主框架分離。所以,在默認(rèn)框架腳手架代碼中,現(xiàn)在已經(jīng)剔除了 Bootstrap 和 Vue 相關(guān)代碼,make:auth 命令也被提取出去。
如果想要恢復(fù)之前版本的 Vue/Bootstrap 腳手架代碼,可以安裝 laravel/ui 擴(kuò)展包,并使用 Artisan 命令 ui 來(lái)安裝前端腳手架代碼:
composer require laravel/ui
php artisan ui vue --auth
總結(jié)
以上是生活随笔為你收集整理的php 6.0新特性,新版特性 | 序言 | Laravel 6 中文文档的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php上传多张图片为什么只显示一张,ja
- 下一篇: php单词出现频率,PHP计算文件或数组