15

我想知道将 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',
));
4

2 回答 2

22

我假设你问这个是因为他们没有工作,而不是确认你已经开始工作了。

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

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

# start/global.php
require app_path().'/filters.php';
于 2013-04-10T22:56:28.710 回答
12

个人的观点是,将事件侦听器集中在一个地方通常是不好的做法。当然,今天您只需要 2 或 3 个,但范围可以随时添加到任何项目中,可能会添加更多。

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

"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并且一切顺利,并将所有相关的事件侦听器放在一个文件中,并将所有事件侦听器放在一个目录中,但要分开,以便如果其中一个出现问题他们您不必搜索所有这些以找到错误发生的位置。

注意:我并没有把它作为一种练习,而是在途中的某个地方发现的。然而,我不记得它在哪里。

于 2014-05-30T20:34:49.123 回答