我在哪里放置事件监听器和处理程序?

时间:2013-04-10 18:11:08

标签: php events laravel laravel-4

我想知道在哪里放置Laravel事件监听器和处理程序。有人告诉我,我可以把它们放在任何地方。这是我到目前为止所尝试过的。

# listeners/log.php
<?php
Event::listen('log.create', 'LogHandler@create');

# handlers/LogHandler.php
<?php
class LogHandler {
        public function create(){
           $character = new Character;
           $character->name = "test";
           $character->save();
    }
}

# controllers/MainController.php
    public function test(){
        Event::fire('log.create');
        return "fired";
     }

# start/global.php
ClassLoader::addDirectories(array(
    app_path().'/commands',
    app_path().'/controllers',
    app_path().'/models',
    app_path().'/database/seeds',
    app_path().'/libraries',
    app_path().'/listeners',
    app_path().'/handlers',
));

2 个答案:

答案 0 :(得分:22)

我会假设你问这个因为他们没有工作,而不是确认你已经工作的东西。

虽然将事件监听器放在任何地方是正确的,但您需要确保它们实际上已被包含在内 - Laravel不会搜索您的源代码来查找它们。

我最喜欢包含此类文件的地方是start/global.php。如果您查看文件的底部,您可以看到包含过滤器的位置,您可以执行相同操作以包含您的监听器。将它们全部保存在一个侦听器文件中是最干净的,就像所有路由都在一个路由文件中一样......

# start/global.php
require app_path().'/filters.php';

答案 1 :(得分:12)

我的个人意见一般来说,将事件监听器集中在一个地方是不好的做法。当然,今天你只需要2或3,但可以随时将范围添加到任何项目中,可能会增加更多。

相反,我通常会在app目录下创建一个目录(例如app/CompanyName)并将所有特定于应用程序的代码放在那里。要告诉Laravel如何找到你的文件,你可以更新你的composer.json llike this:

"autoload": {
    "classmap": [
        // ...
    ],
    "psr-4": {
        "CompanyName\\" : "app/"
    },
}

之后,请务必运行composer dump-autoload

现在,您可以在自定义应用程序目录中创建名称空间目录,例如app/CompanyName/Events/,并且能够将事件侦听器分离为有意义的组,并将它们放在服务提供者中,例如:

<?php namespace CompanyName/Events;
// File: app/CompanyName/Events/LogEventsProvider.php

use Illuminate\Support\ServiceProvider;

class LogEventsProvider extends ServiceProvider
{
    public function register()
    {
        Event::listen('log.create', 'CompanyName/Events/LogEventsProvider@create');
    }

    public function create()
    { 
        // ...
    }
}

现在,您可以将此服务提供程序添加到app/config/app.php并且可以继续使用,并将所有相关的事件侦听器放在一个文件中,并将所有事件侦听器放在一个目录中,如果其中一个出现问题,您不必搜索所有错误,以找出错误发生的位置。

注意:我没有想出这个作为练习,但发现它在路上的某个地方。但是我不记得它在哪里。