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 的开发效率、代码组织、测试便利性和应用性能。

相关推荐
农村小镇哥2 小时前
PHP数据传输流+上传条件+上传步骤
java·开发语言·php
zopple4 小时前
Laravel 7.x 核心特性全解析
php·laravel
爱学习的小囧4 小时前
ESXi 8.0 vSwitch与dvSwitch(分布式交换机)核心区别
服务器·开发语言·分布式·php·虚拟化
zopple4 小时前
Laravel 6.x新特性全解析
php·laravel
biter down4 小时前
UDP 服务端 + 客户端 全场景字节序 & 类型转换
网络协议·udp·php
aq55356005 小时前
Laravel 9.x重磅升级:核心特性全解析
php·laravel
编码者卢布5 小时前
【Azure App Service】PHP页面上传文件413错误的解决方案
microsoft·php·azure
买大橘子也用券5 小时前
one_line_php-wp
web安全·网络安全·php
Dream of maid14 小时前
Python12(网络编程)
开发语言·网络·php