Laravel 5:未找到事件类命名空间/类

时间:2015-04-13 17:10:08

标签: php events laravel namespaces

这更像是一个PHP命名空间问题,而不是Laravel问题。我在Laravel创建了我的第一个事件和处理程序。我和this nice blog post一起非常密切地关注了这本手册。

我的EventServiceProvider.php脚本包括:

/**
 * The event handler mappings for the application.
 *
 * @var array
 */
protected $listen = [
    'event.name' => [
        'EventListener'
    ],
    'App\Events\LeadSignup' => [
        'App\Handlers\Events\SendLeadNotification',
    ],  
];

我不确定这是否正确,但似乎有效。我创建了/app/Handlers/Events/SendLeadNotification.php文件,其中包含:

<?php namespace App\Handlers\Events;

use App\Events\LeadSignup;

use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldBeQueued;

class SendLeadNotification {

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

    /**
     * Handle the event.
     *
     * @param  LeadSignup  $event
     * @return void
     */
    public function handle(LeadSignup $event)
    {
        print("handling it");
        print_r($event);
        exit(0);
    }

}

另外,我的/app/Events/LeadSignup.php事件代码是:

<?php namespace App\Events;

use App\Events\Event;

use Illuminate\Queue\SerializesModels;

class LeadSignup extends Event {

    use SerializesModels;

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

}

我的事件触发代码

\Event::fire(new LeadSignup($lead));

但这导致了一个错误:

  

未找到Class App \ Http \ Controllers \ Site \ LeadSignup

最后,通过明确LeadSignup类的位置,我能够解决它:

\Event::fire(new \App\Events\LeadSignup($lead));

我的问题是:如何使代码更加美观,就像在Laravel文档中一样,我可以简单地调用:

\Event::fire(new LeadSignup($lead));

?或者,换一种方式,我如何将LeadSignup类添加到我的全局命名空间? (如果我的术语不对,我很抱歉。)

解决!

lpeharda的回答对我有用。我在控制器代码中触发事件:

\Event::fire(new LeadSignup($lead));

我添加

use App\Events\LeadSignup

..到我的控制器代码,可以找到该类。这是我完整的控制器代码,以便您可以看到它的实际效果:

<?php

namespace App\Http\Controllers\Site;

use App\Http\Controllers\Controller;
use App\Events\LeadSignup; // <=== here's the additional code

class LeadsController extends Controller {

    public function __construct()
    {
        parent::__construct();      
    }

    public function postInsert()
    {
        if(! \Lead::where('email', '=', \Request::input('email'))->exists()) 
        {
           $lead = \Lead::create(\Request::all());
           \Event::fire(new LeadSignup($lead));
        }
    }

}

?>

1 个答案:

答案 0 :(得分:4)

在您要拨打的文件中

\Event::fire(new LeadSignup($lead));

您需要添加/使用 LeadSignup 事件的命名空间。

因此,例如在该文件的顶部添加

use App\Events\LeadSignup

在打开PHP标记的下方(以及最终的名称空间声明下面):

<?php

希望这会有所帮助。

如果没有,请告诉我你在哪里打电话

Event::fire()
外观,我可以确定准确的位置。