Symfony3——创建一个基于供应商的包



我们想创建一个可以通过composer/packagist部署给其他人使用的bundle。它将封装由MessageBird的所有者创建的逻辑。基本上是一种服务,它将通过ourvendor.messagebird.messaging与容器一起调用。

因为它是一个bundle的类型(根据Sf3的文档),我们创建了一个bundle,同时遵循文档:http://symfony.com/doc/current/bundles/SensioGeneratorBundle/commands/generate_bundle.html

作为目录/src,我们使用/vendor代替。就在那时,一切都出了问题。我们的命名空间无法定位、加载,甚至当我们手动将其添加到Composer的自动加载类中时,它仍然失败。

问题是,这方面的最佳实践是什么?我们现在让它工作,我们所做的是:

  1. 我们用下面的cmd创建了一个bundle:
    • bin/console generate:bundle --shared --namespace=OurVendor/MessageBird/MessageBirdBundle --bundle-name=MessageBirdBundle --format=yml
  2. 我们将/src/OurVendor目录移动到/vendor/OurVendor,因为获得完美生成的唯一方法是使用默认的/src文件夹。我们手动更新了AppKernel.php
  3. 我们对Composer的命名空间做了一些调试,但最终我们将"OurVendor\":"vendor/"添加到根Composer .json中的"autoload/psr-4"指令中。
  4. 我们运行composer dumpautoload && bin/console cache:clear -e dev,结果出现错误。
  5. 我们运行composer -o update,检查所有的依赖并相应地更新,包括自动生成的自动加载文件
  6. 奇怪的是,我们不得不将Bundle添加到AppKernel.php类并再次清理缓存。

在这一切之后,它工作了,但文档中没有提到开发第三方供应商捆绑包。http://symfony.com/doc/current/bundles/best_practices.html

长话短说,我们是走错路了还是怎么了?

/vendor目录由composer管理。不要复制/移动任何东西。甚至不要在那里编辑任何东西,除非你了解所有的后果。

当你创建一个共享包时,你需要将它推送到你选择的VCS中,并将它作为一个依赖项添加到使用它的项目的composer.json中。

当你运行composer update时,它会签出你的包到/vendor目录,并生成正确的自动加载文件。

请阅读更多如何使用私有存储库与composer。

相关内容

  • 没有找到相关文章

最新更新