如何在 Laravel Lumen 中实现事件

Posted

技术标签:

【中文标题】如何在 Laravel Lumen 中实现事件【英文标题】:How to implement Events in Laravel Lumen 【发布时间】:2015-07-16 07:04:21 【问题描述】:

我已经用 Homestead 安装了 Lumen,我正在尝试实现事件。

在the documentation 中说

.. 在 bootstrap/app.php 中取消注释 $app->withFacades() 调用 文件。

要订阅一个事件,你可以使用 Event::listen 方法

当我从文档中复制粘贴示例代码时,出现下一个错误

Fatal error: Class 'Event' not found in /home/vagrant/project/...

我在 Lumen 文档中找不到任何为什么这不起作用。

在tutorial for Laravel 5 上,我注意到使用artisan make:event 命令创建的事件具有类似use App\Events\Event; 的use 语句 那可能是我需要的缺少的 Event 类,但是如果该工匠命令不存在,应该如何在 Lumen 项目中获取它?

【问题讨论】:

【参考方案1】:

我不确定您使用的是哪个版本的 Lumen。在 Lumen 5.2 到 5.4 中,这是创建事件的方式。 Lumen 5.4 Events.

app/Events/Event.php(这完全是一个可选类,唯一重要的是使用'SerializesModels')

<?php
namespace App\Events;
use Illuminate\Queue\SerializesModels;
abstract class Event

  use SerializesModels;

app/Events/ExampleEvent.php

<?php
namespace App\Events;
class ExampleEvent extends Event

    /**
     * Create a new event instance.
     * @return void
     */
    public function __construct()
    
     //
    

现在将Event类绑定到事件监听器

app/Providers/EventServiceProvider.php

<?php
namespace App\Providers;
use Laravel\Lumen\Providers\EventServiceProvider as ServiceProvider;
class EventServiceProvider extends ServiceProvider

    /**
     * The event listener mappings for the application.
     * @var array
     */
    protected $listen = [
       'App\Events\SomeEvent' => [
           'App\Listeners\EventListener',
        ],
    ];

最后但并非最不重要的一点,不要忘记在

中取消注释/添加以下行

bootstrap/app.php

$app->withFacades();

$app->register(App\Providers\EventServiceProvider::class);

【讨论】:

这是 Lumen 的重要一步:- $app->withFacades(); $app->register(App\Providers\EventServiceProvider::class);【参考方案2】:

我相信这归结为:

$app->withFacades();

在 bootstrap/app.php 中不包括作为类别名的事件外观。

添加:

class_alias('Illuminate\Support\Facades\Event', 'Event');

到 Laravel\Lumen\Application.php::withFacades() 修复了这个问题,但由于这是一个核心 Lumen 文件,因此不推荐修复。

【讨论】:

【参考方案3】:

可能听起来很傻,但您是否在顶部指定了use Event;

取消注释 $app-&gt;withFacades(); 已创建别名,但您仍需要导入它。

【讨论】:

【参考方案4】:

问题似乎是 Laravel 中存在但 Lumen 脚手架中缺少的 App\Events\Event; 类。

缺少的类只是一个抽象的空类:

<?php

namespace App\Events;

abstract class Event

    //

Lumen 文档有一个模棱两可的例子,希望他们将来能纠正这个问题。

<?php

namespace App\Events;

use App\Podcast;
use App\Events\Event;
use Illuminate\Queue\SerializesModels;

class PodcastWasPurchased extends Event

    use SerializesModels;

    public $podcast;

    /**
     * Create a new event instance.
     *
     * @param  Podcast  $podcast
     * @return void
     */
    public function __construct(Podcast $podcast)
    
        $this->podcast = $podcast;
    

【讨论】:

以上是关于如何在 Laravel Lumen 中实现事件的主要内容,如果未能解决你的问题,请参考以下文章

如何在接收事件的多个 Laravel/Lumen 侦听器中保留模型状态?

如何解决 Lumen/Laravel 中的单例?

如何在 laravel 中实现 vuetify?

如何使用 Laravel 在网站中实现 OCR

如何在 laravel 5.1 中实现“记住我”?

如何在 Laravel 网站中实现主题选项?