Laravel 8 新特性: 动态Blade组件、事件监听器优化、事件测试助手

1,127 阅读2分钟

这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战

之前写了一篇Laravel提高DB查询效率的文章,转发到群里后竟然有人质疑我说“Laravel是他好几年前用的框架,没想到现在还有人在用。”

纳尼,什么意思嘛?别忘了PHP是最好的语言!

个人认为Laravel是非常优雅的开发框架:优雅的设计模式、强大的功能实现、各种方便的扩展、持续的版本更新,更主要的是迄今为止我认为最优秀的技术开发社区。

我必须为Laravel打Call。

2020年9月8号,Laravel发布了8.0版本。 Laravel计划于2022年1月25日发布9.0版本。

下面我介绍一下目前Laravel最新版(8.0版本)的新特性:

Laravel 8 通过引入 Laravel Jetstream,模型工厂类,迁移压缩,队列批处理,改善速率限制,队列改进,动态 Blade 组件,Tailwind 分页视图, 时间测试助手,artisan serve 的改进,事件监听器的改进,以及各种其他错误修复和可用性改进,对 Laravel 7.x 继续进行了改善。

今天重点介绍 动态Blade组件、事件监听器优化、事件测试助手 相关的知识点

动态 Blade 组件

有时我们需要渲染一个组件,但是不确定在运行时应该渲染哪个组件。在这种情况下,我们现在可以使用 Laravel 内置的 dynamic-component 组件去根据运行时的某个值或某个变量来动态渲染组件:

<x-dynamic-component :component="$componentName" class="mt-4" />

事件监听器优化

现在可以通过给 Event::listen 方法传入一个闭包函数来简单的注册一个基于闭包的事件监听器。Laravel 会检查闭包以确定监听器处理的事件类型。

use App\Events\PodcastProcessed;
use Illuminate\Support\Facades\Event;

Event::listen(function (PodcastProcessed $event)     {
    //
});

此外,现在可以使用 Illumate\Events\Queueable 函数将基于闭包的事件监听器标记为可排队:

use App\Events\PodcastProcessed;
use function Illuminate\Events\queueable;
use Illuminate\Support\Facades\Event;

Event::listen(queueable(function (PodcastProcessed $event) {
    //
}));

像队列任务一样,我们可以使用 onConnection、onQueue 和 delay 方法自定义队列监听器的执行:

Event::listen(queueable(function (PodcastProcessed $event) {
    //
})->onConnection('redis')->onQueue('podcasts')->delay(now()->addSeconds(10)));

如果我们想处理匿名队列的监听器故障,可以在定义 queueable 监听器时给 catch 方法提供一个闭包:

use App\Events\PodcastProcessed;
use function Illuminate\Events\queueable;
use Illuminate\Support\Facades\Event;
use Throwable;

Event::listen(queueable(function (PodcastProcessed $event) {
    //
})->catch(function (PodcastProcessed $event, Throwable $e) {
    // The queued listener failed...
}));

时间测试助手

测试时,我们有时可能需要修改诸如 now 或 Illuminate\Support\Carbon::now() 之类的函数返回的时间。 Laravel 的基本功能测试类现在包括时间测试助手函数,我们可以使用它们来操纵当前时间:

public function testTimeCanBeManipulated()
{
    // 时间穿越至未来...
    $this->travel(5)->milliseconds();
    $this->travel(5)->seconds();
    $this->travel(5)->minutes();
    $this->travel(5)->hours();
    $this->travel(5)->days();
    $this->travel(5)->weeks();
    $this->travel(5)->years();

    // 时间穿越至过去...
    $this->travel(-5)->hours();

    // 前往明确的时间...
    $this->travelTo(now()->subHours(6));

    // 回到当前时间...
    $this->travelBack();
}

华丽的分割线

要了解更多有关在Laravel的知识点,请查看我的专栏: 服务端开发从入门到精通

推荐阅读

  1. 竟然有人质疑我还在用Laravel开发?别忘了PHP是最好的语言。(1)Laravel如何优雅的设置全局变量

  2. 竟然有人质疑我还在用Laravel开发?别忘了PHP是最好的语言。(2)Laravel Jetstream和模型工厂类

  3. 竟然有人质疑我还在用Laravel开发?别忘了PHP是最好的语言。(3)迁移压缩,队列批处理,改善速率限制

  4. 竟然有人质疑我还在用Laravel开发?别忘了PHP是最好的语言。(4)维护模式优化

Last but not least

技术交流群请到 这里来。 或者添加我的微信 wangzhongyang0601 ,一起学习。