我想知道在哪里放置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',
));
答案 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
并且可以继续使用,并将所有相关的事件侦听器放在一个文件中,并将所有事件侦听器放在一个目录中,如果其中一个出现问题,您不必搜索所有错误,以找出错误发生的位置。
注意:我没有想出这个作为练习,但发现它在路上的某个地方。但是我不记得它在哪里。