我应该把我的独白自定义处理程序在我的Symfony2项目


Where should I place my Monolog custom Handler in my Symfony2 project?

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

我试图把我的处理程序类在lib/,但它似乎不工作(也许我必须做一些特别的自动加载?)。

或者我应该为这个处理程序创建一个新的bundle吗?

编辑:我不能真的把我的自定义处理程序类在vendor/monolog/monolog/src/Monolog/Handler,因为这样我就不能把它添加到我的git存储库:有一个冲突,因为这个文件夹是由另一个git存储库管理(由作曲家创建)

在独白的最后,确实没有限制放在哪里或如何称呼它。关键是它实现了独白的HandlerInterface或从现有的处理程序之一扩展。

现在这取决于你的处理程序是什么,如果它是其他人可以使用的通用东西,你可以将它作为拉请求提交给独白。
如果没有,你可以为它创建一个自己的编写器包,或者把它放在src/Acme/Monolog/FooHandler或类似的地方,这样它就会留在你的应用程序中,但显然不是一个包。缺点是你需要将它配置为一个bundle中的服务,所以你仍然需要依赖某个bundle。
也许把它作为自己的捆绑包是有意义的。但是对于一个类来说,这是相当多的样板文件。如果你所有的包都是特定于应用程序的,并且不太可能从中提取出来,那么在我看来,拥有跨包依赖关系是很好的。无论如何,依赖关系不是很强,因为一个bundle可以包含处理程序并配置它。其他包仍然可以记录到独白,即使处理程序不存在,它们也可以记录。它只是不会去到那个特定的处理器。什么都不会坏的。

正如你所看到的,这只是很多权衡,在不了解你的项目的情况下,很难说哪种解决方案是最合适的。

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

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

查看Composer文档:

基本用法

自动装载

我认为这里常见的方法是在Bundle中使用一个带有明确依赖关系的"Bridge"目录。如果你有其他依赖于这个的bundle,我们所做的就是创建一个ServiceBundle,它基本上用于应用中所有bundle之间的所有共享服务。如果你打算发布这个包,这可能不太适合你,但也可以。