Symfony2-创建自己的供应商捆绑包-项目和 git 策略

我们正在考虑为实体映射和服务创建自己的 common包,以便在几个单独的应用程序中使用。包应该易于修改、运行、包含和测试。我知道 结构化捆绑包的最佳实践,但是我不知道在开发时使用什么 git策略。

我们应该将 common bundle 作为一个整体项目创建,并将整个存储库提交给我们的 git 服务器,还是仅为 common bundle 的根启动源代码控制并仅推送其内容更好?我在 github上的 bundle 中看到了这种方法,但是我不知道用这种方式开发 bundle 的简单和舒适的方法。

34167 次浏览

创建一个新的空 symfony 项目

php composer.phar create-project symfony/framework-standard-edition demo/ 2.4.1
cd demo

生成一个新包

(例如 src/Company/DemoBundle)

php app/console generate:bundle
cd src/Company/DemoBundle/

src/Company/DemoBundle中初始化 github 存储库

git init
touch README.md
git add .
git commit -m "initial commit"
git remote add origin https://github.com/YourAccount/DemoBundle.git
git push -u origin master

添加一个 comper.json 文件

返回文章页面

{
"name" : "company/demobundle",
"description" : "A demo bundle",
"type" : "symfony-bundle",
"authors" : [{
"name" : "demo",
"email" : "demo@company.com"
}],
"keywords" : [
"demo bundle"
],
"license" : [
"MIT"
],
"require" : {
},
"autoload" : {
"psr-0" : {
"Company\\DemoBundle" : ""
}
},
"target-dir" : "Company/DemoBundle",
"repositories" : [{
}],
"extra" : {
"branch-alias" : {
"dev-master" : "some_version-dev"
}
}
}

现在您已经得到了 bundle 的基本结构

在另一个项目中使用它

Json:

    [...]
"require" : {
[...]
"company/demobundle" : "dev-master"
},
"repositories" : [{
"type" : "vcs",
"url" : "https://github.com/Company/DemoBundle.git"
}],
[...]

做:

curl -sS https://getcomposer.org/installer | php
php composer.phar update company/demobundle

应用程序/应用内核:

new Company\DemoBundle\CompanyDemoBundle(),

好好想想

  • 您可以在 src/Company文件夹中克隆 DemoBundle,然后手动安装它
  • 可以使用 symlink

结论

您可以在第一个项目中开发和测试您的捆绑包,并在第二个项目中与 github 和作曲家一起使用它。

需要知道的一点是,您可以从/供应商提交回购。事实上,作曲家为每个包(或包)创建了第二个远程名为“余音绕梁”的引用包的回购,以便您可以在工作上下文中处理它。 因此,最好的做法是将您的包注册到您的 poser.json 中,用于所有的项目,并从 /vendor/MyCompany/MyBundle中提交,从任何项目中提交。

作为证明,只需在供应商中的任何包中运行 git remote -v

不好的做法是将捆绑包视为一个单独的项目,并与之建立符号链接。这种做法不好的主要原因是您不能使用 bundle 声明依赖关系。此外,您在项目的部署方面会遇到一些困难。

在 Symfony4中,generate:bundle命令不再可用。

首先创建一个项目:

composer create-project symfony/website-skeleton my-project

然后,创建一个 my-project/lib/AcmeFooBundle/src目录。这里将住你的捆绑。这个目录的命名空间将是 Acme\AcmeFooBundle,因此如果您在 lib/AcmeFooBundle/src/Service/Foo.php创建一个服务类,它的命名空间将是 Acme\AcmeFooBundle\Service

现在我们需要告诉作曲家 autoloader 在新的目录中寻找新的类,所以我们需要编辑 composer.json autoload部分:

"autoload": {
"psr-4": {
"Acme\\AcmeFooBundle\\": "lib/AcmeFooBundle/src/",
}
},

运行 composer dump-autoload

现在您只需要将 bundle 类添加到 config/bundles.php:

return [
...
Acme\AcmeFooBundle\AcmeFooBundle::class => ['all' => true],
];

依赖注入从 bundle 中加载配置。

如果你想在添加依赖注入前检查一下你的服务,你可以在 config/services.yml上自动装配:

services:
...
Acme\AcmeFooBundle\Services\Foo: ~

就这样,跟着 最佳做法继续编码。

附言: 我在 开发 Symfony 可重用包的一些技巧上发表了一篇文章。