我应该在我的Symfony2项目中将我的Monolog自定义处理程序放在哪里?

时间:2013-03-05 14:35:12

标签: php symfony handler composer-php monolog

我创建了一个派生自AbstractProcessingHandler的处理程序类。我已经看到我可以将它放在src/MyNamespace/MyBundle/Monolog/中,但它让我有点担心,因为这个处理程序在我记录数据的其他几个包中使用。所以其他捆绑包需要MyBundle才能正常工作,只是因为这个处理程序。

我试图将我的处理程序类放在lib/中,但它似乎不起作用(也许我必须对Autoload做一些特别的事情?)。

或者我应该专门为此处理程序创建一个新的包吗?

编辑:我无法将自定义处理程序类放在vendor/monolog/monolog/src/Monolog/Handler中,因为我无法将其添加到我的git存储库中:存在冲突,因为此文件夹由另一个git存储库管理(由Composer创建)

3 个答案:

答案 0 :(得分:2)

在Monolog的结尾,对于放置它或者如何调用它没有任何限制。关键是它只实现了monolog的HandlerInterface或从现有的一个处理程序扩展。

现在它取决于你的处理程序是什么,如果它是其他人可以使用的通用东西,你可以将它作为拉动请求提交给monolog。
如果没有,你可以为它创建一个自己的作曲家包,或者把它放在src/Acme/Monolog/FooHandler或类似的东西中,所以它会留在你的应用程序中,但显然不在捆绑中。缺点是您需要将其配置为其中一个捆绑包中的服务,因此您仍然对捆绑包具有某种依赖性。
也许将它作为自己的捆绑包就可以了。但是对于一个班级来说,它是相当多的样板 如果您的所有捆绑包都是特定于应用程序的,并且不太可能从中提取出来,那么通过IMO可以实现跨捆绑依赖性。 依赖性无论如何都不是很强,因为一个bundle可以包含处理程序并对其进行配置。其他包仍然可以记录到monolog,即使处理程序不存在,它们也可以记录。它只是不会去那个特定的处理程序。什么都不应该破坏。

如您所见,这只是一个权衡取舍,如果不了解您的项目,很难说哪个解决方案最合适。

答案 1 :(得分:0)

如果您希望在lib/中安装处理程序类,则需要将lib/文件夹添加到composer.json自动加载部分。例如:

"autoload": {
    "psr-0": { "": ["src/", "lib/"] }
}

查看Composer文档:

Basic Usage

Autoload

答案 2 :(得分:0)

我认为这里常见的方法是在你的Bundle中使用一个明确依赖的“Bridge”目录。如果您有其他依赖于此的捆绑包,我们所做的就是创建一个ServiceBundle,它基本上适用于应用程序中所有捆绑包的所有共享服务。如果您有分发此捆绑包的计划,这可能不适合您,但可能会这样做。