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

Str*_*rnd 14 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',
));
Run Code Online (Sandbox Code Playgroud)

Phi*_*rks 22

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

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

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

# start/global.php
require app_path().'/filters.php';
Run Code Online (Sandbox Code Playgroud)

  • +1好建议.然而,我想知道是否还有另一个有趣的选择...也许为类听众创建一个"app/listeners"文件夹......?并将`app_path().'/ listeners',`添加到`ClassLoader :: addDirectories(array(`at app/start/global.php` ...? (5认同)

Jef*_*ert 12

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

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

"autoload": {
    "classmap": [
        // ...
    ],
    "psr-4": {
        "CompanyName\\" : "app/"
    },
}
Run Code Online (Sandbox Code Playgroud)

在那之后,一定要跑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()
    { 
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以将此服务提供程序添加到您的计算机中app/config/app.php,并将所有相关的事件侦听器放在一个文件中,并将所有事件侦听器放在一个目录中,然后将其分开,以便在出现问题时将其与他们不必搜索所有这些内容来查找错误发生的位置.

注意:作为一种练习,我没有提出这个问题,但在整个过程中找到了它.但是我不记得它在哪里.