如何在 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->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 中实现事件的主要内容,如果未能解决你的问题,请参考以下文章