Laravel 8.x十大核心特性深度解析

好的,Laravel 8.x 版本引入了多项重要特性与改进:

1. Laravel Jetstream

  • 提供了一套现代化的应用脚手架,整合了 LivewireInertia.js 栈。
  • 包含登录、注册、邮箱验证、双因素认证、会话管理、API 支持等开箱即用的功能。
  • 替代了之前的 Laravel UI,提供更丰富的起点。

2. 模型工厂类 (Model Factory Classes)

  • 模型工厂从基于函数的定义转变为基于类的定义。
  • 例如:
php 复制代码
// Laravel 7.x 及之前 (database/factories/UserFactory.php)
$factory->define(User::class, function (Faker $faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
    ];
});

// Laravel 8.x (database/factories/UserFactory.php)
class UserFactory extends Factory {
    public function definition() {
        return [
            'name' => $this->faker->name(),
            'email' => $this->faker->unique()->safeEmail(),
        ];
    }
}

更符合现代 PHP 的面向对象风格。

3. 迁移压缩 (Migration Squashing)

  • 允许将应用程序的多个迁移文件压缩成单个 SQL 文件。
  • 使用命令 php artisan schema:dump
  • 可以显著减少运行测试时加载迁移的数量,提升测试速度。

4. 改进的路由缓存 (Improved Route Caching)

  • 使用 php artisan route:cache 时,现在会先执行 php artisan route:clear,避免旧缓存问题。
  • 提高了路由缓存的可靠性。

5. 模型命名空间调整 (默认 App\Models)

  • artisan make:model 命令现在默认将模型创建在 App\Models 目录下。
  • 更符合现代应用程序的目录组织结构。之前的版本默认在 App 根目录下。

6. 队列批处理 (Job Batching)

  • 允许将一组作业作为一个可管理的"批处理"进行调度和监控。
  • 提供方法跟踪批处理的进度、状态和完成情况。
php 复制代码
use Illuminate\Bus\Batch;
use Illuminate\Support\Facades\Bus;
use App\Jobs\ProcessPodcast;
use Throwable;

$batch = Bus::batch([
    new ProcessPodcast(1),
    new ProcessPodcast(2),
    new ProcessPodcast(3),
])->then(function (Batch $batch) {
    // 所有作业成功完成...
})->catch(function (Batch $batch, Throwable $e) {
    // 批处理中首次检测到失败的作业...
})->finally(function (Batch $batch) {
    // 批处理执行完毕(无论成功或失败)...
})->dispatch();

7. 速率限制改进 (Rate Limiting Improvements)

  • 在路由中定义速率限制器变得更加灵活和强大。
  • 支持自定义响应和条件限制。
php 复制代码
Route::get('/api/users', function () {
    //
})->middleware(['throttle:api']);

可以在 App\Providers\RouteServiceProvider 中配置 api 限制器。

8. 时间测试助手改进 (Improved Time Testing Helpers)

  • Illuminate\Support\Carbon 新增了 setTestNow($now = null) 方法。
  • 提供了更简洁的方式来在测试中操纵时间。

9. 动态 Blade 组件属性

  • 允许将 HTML 属性动态传递给 Blade 组件。
blade 复制代码
<x-alert :$type :$message class="mt-4"/>

组件内部可以通过 {``{ $attributes }} 接收所有属性。

10. dispatchAfterResponse 方法

  • 允许在 HTTP 响应发送到浏览器之后才将作业推送到队列。
php 复制代码
ProcessPodcast::dispatchAfterResponse();

11. Eloquent 改进

  • whereHas / orWhereHas 嵌套支持:允许更复杂的关联查询。
  • doesntHave / orDoesntHave 嵌套支持
  • upsert 方法:实现"插入或更新"操作。
php 复制代码
Flight::upsert([
    ['departure' => 'LAX', 'destination' => 'NYC', 'price' => 150],
    ['departure' => 'LHR', 'destination' => 'AMS', 'price' => 200]
], ['departure', 'destination'], ['price']);

12. 测试改进

  • HTTP 测试断言 :新增了如 assertCreatedassertForbiddenassertNoContent 等断言方法。
  • 数据库测试 :新增了 expectsDatabaseQueryCount 方法,用于断言测试期间执行的数据库查询数量。

13. 事件监听器优化

  • 可以在事件监听器中返回 false 来停止事件的传播。

这些特性显著提升了 Laravel 的开发效率、代码组织、测试便利性和应用性能。

相关推荐
纯.Pure_Jin(g)14 小时前
靶场PHP函数整理+防御方式
开发语言·php·ctf
神仙别闹17 小时前
基于C++ WinPcap 的网络抓包软件
网络·c++·php
斑马13919 小时前
Linux软件编程学习笔记(五)——线程
开发语言·php
学习星球20 小时前
空天地一体化网络(NTN)深度解析:从Starlink D2C到3GPP NTN,卫星直连手机是如何实现的?
网络·人工智能·算法·智能手机·php
郑州光合科技余经理1 天前
本地生活服务系统:模块边界与结算字段怎么拆
java·开发语言·前端·后端·系统架构·uni-app·php
2601_962072502 天前
网络安全防护指南:筑牢网络安全防线(510)
安全·web安全·php
Patrick在香港2 天前
Python 拉取城巴开放数据:406 条路线,香港岛巴士网络的数字画像
网络·python·数据分析·php·数据可视化·香港·开放数据
吴声子夜歌2 天前
Java——开发中通用的方法和准则(二)
java·开发语言·php
2601_962065492 天前
PHP For 循环
android·java·php