Laravel监听包裹事件

时间:2018-07-19 11:14:55

标签: php laravel events listener

我想听包(Laravel impersonate)触发的事件。

当我这样设置EventServiceProvider时:

<?php

namespace App\Providers;

use App\Listeners\LogImpersonation;
use Illuminate\Support\Facades\Event;
use Lab404\Impersonate\Events\TakeImpersonation;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;

class EventServiceProvider extends ServiceProvider
{
    /**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        TakeImpersonation::class => [
            LogImpersonation::class,
        ]
    ];

    /**
     * Register any events for your application.
     *
     * @return void
     */
    public function boot()
    {
        parent::boot();

        //
    }
}

我收到以下错误:

  

传递给App \ Listeners \ LogImpersonation :: handle()的参数1必须为   App \ Events \ TakeImpersonation的实例,   提供了Lab404 \ Impersonate \ Events \ TakeImpersonation

我的LogImpersonation:

<?php

namespace App\Listeners;

use App\Events\TakeImpersonation;
use App\User;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Support\Facades\Log;

class LogImpersonation
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  TakeImpersonation  $event
     * @return void
     */
    public function handle(TakeImpersonation $event)
    {
        Log::info($event->impersonator->name . ' ingelogd als ' . $event->impersonated);
    }
}

我无法想象必须移动事件,这是我第一次尝试使用事件,因此我肯定缺少一些简单的东西。

2 个答案:

答案 0 :(得分:1)

错误消息告诉您恰好出了什么问题:

  

传递给App \ Listeners \ LogImpersonation :: handle()的参数1必须是App \ Events \ TakeImpersonation的实例,并已指定Lab404 \ Impersonate \ Events \ TakeImpersonation的实例

因此,您的App\Listeners\LogImpersonation::handle()方法期望给出App\Events\TakeImpersonation的实例,但是却得到了Lab404\Impersonate\Events\TakeImpersonation

您需要更新您的侦听器类以导入适当的类。因此,在顶部的导入中,将App\Events\TakeImpersonation(您实际上正在侦听的包事件的全名)交换Lab404\Impersonate\Events\TakeImpersonation(这是错误的,并且在您的应用程序中将不存在)。

答案 1 :(得分:0)

看一下LogImpersonation@handle方法-它使用$event自变量,类型为App\Events\TakeImpersonation。要解决该错误,必须从程序包的Lab404\Impersonate\Events\TakeImpersonation派生此类。

如果不需要扩展软件包事件类,则可以通过更改文件App\Events\TakeImpersonation中的use语句来删除LogImpersonation版本并使用软件包版本:

<?php

namespace App\Listeners;

use Lab404\Impersonate\Events\TakeImpersonation; // here
use App\User;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Support\Facades\Log;

class LogImpersonation
{