Laravel event 事件的简单使用

有时候当我们单纯的看 Laravel手册的时候会有一些疑惑,比如说系统服务下的授权和事件,这些功能服务的应用场景是什么,其实如果没有经历过一定的开发经验有这些疑惑是很正常的事情,但是当我们在工作中多加思考会发现有时候这些服务其实我们一直都见过。下面就事件、事件监听举一个很简单的例子你就会发现。

这个例子是关于文章的浏览数的实现,当用户查看文章的时候文章的浏览数会增加1,用户查看文章就是一个事件,有了事件,就需要一个事件监听器,对监听的事件发生后执行相应的操作(文章浏览数加1),其实这种监听机制在 Laravel 中是通过观察者模式实现的.
链接

laravel 事件监听使用大概分为以下步骤:

  • ① 注册事件和事件监听器
  • ② 生成事件文件和事件监听器文件
  • ③ 定义事件
  • ④ 定义事件监听器
  • ⑤ 分发事件 (调用事件)

1. 注册事件和事件监听器

在我们使用事件之前,首先应该先去 app/Providers/ 目录下打开 EventServiceProvider.php 文件之后我们会看到如下的一个数组


    
    
  1. protected $listen = [
  2. 'App\Events\Event' => [
  3. 'App\Listeners\EventListener',
  4. ],
  5. 'App\Events\ArticleEvent' => [
  6. 'App\Listeners\ArticleEventListener',
  7. ],
  8. 'App\Events\AdminLoginEvent' => [
  9. 'App\Listeners\AdminLoginEventListener',
  10. ],
  11. 'Illuminate\Database\Events\QueryExecuted' => [
  12. 'App\Listeners\QueryListener'
  13. ],
  14. ];

数组 $listen 是用来注册我们的事件和事件监听器的一个数组,其中数组的键为我们需要定义的事件,值对应的为我们需要定义的事件监听器,
比如我这里,需要注册的
事件为:ArticleEvent 指定路径为 App\Events\ArticleEvent (处理文章点击的一个事件)
事件监听器为:ArticleEventListener 指定路径为 App\Listeners\ArticleEventListener (监听文章点击事件的监听器)
我们需要把指定路径对应上图,增加到数组中,
此时我们已经注册好了事件和监听器

2. 生成事件文件和事件监听器文件

事件文件存放在 app/Events 目录下 监听器 存放在 app/Listeners 目录下 此时我们虽然定义好了监听器,但是对应文件并不存在,我们需要使用 laravel 的 artisan 命令 来在指定目录下生成 事件文件 ArticleEvent 和 事件监听 ArticleEventListener 文件

php artisan event:generate
    
    

 文件生成之后,下面开始定义事件

3. 定义事件

打开 app/Events 目录下的 ArticleEvent .php 事件文件,如下有个结构函数


    
    
  1. class ArticleEvent
  2. {
  3. use Dispatchable, InteractsWithSockets, SerializesModels;
  4. public $article;
  5. /**
  6. * Create a new event instance.
  7. *
  8. * @return void
  9. */
  10. public function __construct(Article $article)
  11. {
  12. //
  13. $this->article = $article;
  14. }
  15. /**
  16. * Get the channels the event should broadcast on.
  17. *
  18. * @return \Illuminate\Broadcasting\Channel|array
  19. */
  20. public function broadcastOn()
  21. {
  22. return new PrivateChannel( 'channel-name');
  23. }
  24. }

当我们在调用事件的时候我们有时候需要,给事件传递参数,这个参数可能是个 ORM 模型 也可能是个数据集 或者是个字符串,此时如果我们希望事件能够接收到我们传递的参数,就需要在 construct () 结构函数中来 定义接收,有两种方法:
第一种
我们使用依赖注入的方式定义接收的参数 (文档中便是此方法), 假如我们接收的参数为 Eloquent ORM 对象 Article 则我们需要在事件中 引入 Article模型,然后在 construct () 指定依赖,在定义完接收对象之后,还需要定义一个 pubic 属性 然后将接收的参数赋值给这个 public 属性,以便于 事件监听 程序调用 我们这里定义为 public $article 如下:


    
    
  1. namespace App\ Events;
  2. use App\ Http\ Models\ Article;

    
    
  1. public function __construct(Article $article)
  2. {
  3. //
  4. $this->article = $article;
  5. }

第二种
使用普通的参数接收方式,直接在 construct () 函数中指定一个参数用来接收调用事件传递的参数,这种就和我们正常函数传参相同,同样我们需要定义一个 公有属性,将参数赋值给这个公有属性,这里仍然使用 public $article,如下


    
    
  1. public function __construct($article)
  2. {
  3. //
  4. $this->article = $article;
  5. }

以上我们,可以通过两种方式来定义事件的接收

4. 定义事件监听器

打开 app/Listeners 目录下的 ArticleEventListener.php 事件文件,在事件监听文件中有个 handle 函数用来处理我们的业务逻辑
如下:


    
    
  1. public function handle(ArticleEvent $event)
  2. {
  3. //
  4. $id = $event->article->id;
  5. Article::where( 'id',$id)->increment( 'hits');
  6. }

5. 分发事件 (调用事件)

上面我们都定义好之后在我们业务需要的地方执行分发事件 (调用事件) 使用 event (new 事件名 (参数)) 来执行事件分发 (事件调用)
注意: 如果我们定义事件的时候使用的是依赖注入的方式来传递参数,那么我们在分发事件的时候 只能传递我们指定的依赖,否则会报错,例如我们上面使用的 Article $article 依赖 则在调用事件的时候 我们只能在我们的控制器中 传递 模型 Article的 ORM 模型如下:


    
    
  1. use App\ Events\ArticleEvent;
  2. use App\ Http\Models\Article;

    
    
  1. public function article_detail(Request $request)
  2. {
  3. $article_id = Input::get( 'article_id');
  4. $info = Article::where([ 'id'=>$article_id])->first();
  5. event( new ArticleEvent($info));
  6. return view( 'home.article.article_detail')->with([
  7. 'info'=>$info
  8. ]);
  9. }

当我们查看文章时,文章点击数就会自动加1

当我们使用第二种方法来定义事件的接收时,我们在调用事件时,传递的参数就会没有限制了 我们可以根据需要传递不同的参数到事件中去,然后在事件监听中 根据业务需求来获取参数处理业务逻辑

 

以上便是两种定义方式的,两种事件调用方式

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单Laravel事件案例,以便更好地了解Laravel事件使用: 1. 定义事件Laravel中,您可以使用`make:event` Artisan命令来创建一个事件类。例如,我们将创建一个名为`OrderShipped`的事件类: ``` php artisan make:event OrderShipped ``` 这将在`app/Events`目录中创建一个名为`OrderShipped`的事件类。 2. 定义事件发布者 事件发布者是触发事件的类。在我们的案例中,让我们假设`Order`类在订单发货时触发`OrderShipped`事件。我们可以在`Order`类中使用Laravel的`dispatch`方法来发布事件: ```php use App\Events\OrderShipped; class Order { public function ship() { // 订单发货逻辑 // 发布事件 event(new OrderShipped($this)); } } ``` 3. 定义事件订阅者 事件订阅者是响应事件的类。在我们的案例中,让我们定义一个类来记录日志并发送电子邮件: ```php namespace App\Listeners; use App\Events\OrderShipped; class SendShipmentNotification { public function handle(OrderShipped $event) { // 记录日志 Log::info('Order shipped with ID: ' . $event->order->id); // 发送电子邮件 Mail::to($event->order->customer->email)->send(new OrderShippedEmail($event->order)); } } ``` 在上面的代码中,我们定义了一个`SendShipmentNotification`类来订阅`OrderShipped`事件。当事件被触发时,`handle`方法将被调用,记录日志并发送电子邮件。 4. 注册事件订阅者 最后,我们需要在Laravel应用程序中注册事件订阅者。我们可以在`EventServiceProvider`类中使用`$listen`属性来注册订阅者: ```php namespace App\Providers; use Illuminate\Support\Facades\Event; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; class EventServiceProvider extends ServiceProvider { protected $listen = [ OrderShipped::class => [ SendShipmentNotification::class, ], ]; public function boot() { parent::boot(); } } ``` 在上面的代码中,我们将`OrderShipped`事件订阅到`SendShipmentNotification`类。这将导致`SendShipmentNotification`类在`OrderShipped`事件被触发时执行其`handle`方法。 现在,当我们在`Order`类中调用`ship`方法时,它将触发`OrderShipped`事件并导致`SendShipmentNotification`类执行其`handle`方法,记录日志并发送电子邮件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值