路由模型绑定优化
路由模型绑定优化由 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 属性:
<?php namespace 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 次。但是,如果任务抛出三个未处理的异常,则该任务将失败。