Background
我创建了一个托管在GitHub上的Symfony2应用程序。现在我想把它变成一个捆绑包而不是一个应用程序,以便与 Composer 一起使用。
我尝试过什么
我在GitHub上创建了一个名为AsyncTweetsBundle的新存储库,我认为我的供应商名称应该AlexisLefebvre
并且捆绑名称AsyncTweetsBundle
。但是我不明白如何配置composer.json文件,这是文件的当前内容:
{
"name" : "alexislefebvre/async-tweets-bundle",
"type" : "symfony-bundle",
"description" : "PHP Twitter reader for asynchronous reading",
"keywords" : ["twitter", "reader", "bundle"],
"homepage": "http://asynctweets.alexislefebvre.com/",
"license" : "MIT",
"authors" : [{
"name" : "Alexis Lefebvre",
"homepage": "http://alexislefebvre.com/",
"role": "Developer"
}],
"require" : {
"php": ">=5.3.2",
"abraham/twitteroauth": "0.5.0"
},
"autoload" : {
"psr-0" : {
"AlexisLefebvre\Bundle\AsyncTweetsBundle" : ""
}
},
"target-dir": "AlexisLefebvre/Bundle/AsyncTweetsBundle",
"extra": {
"branch-alias": {
"dev-master": "0.1-dev"
}
}
}
这是捆绑包 AlexisLefebvreAsyncTweetsBundle 的基类:
<?php
namespace AlexisLefebvreBundleAlexisLefebvreAsyncTweetsBundle;
use SymfonyComponentHttpKernelBundleBundle;
class AlexisLefebvreAsyncTweetsBundle extends Bundle
{
}
我已经在Packagist上提交了这个包:alexislefebvre/async-tweets-bundle。
所以我创建了一个 Symfony2 安装并添加了这个依赖项:
composer create-project
symfony/framework-standard-edition symfony2_AsyncTweetBundle --prefer-dist
cd symfony2_AsyncTweetBundle/
composer require alexislefebvre/async-tweets-bundle
捆绑包安装在vendor/alexislefebvre/async-tweets-bundle/AlexisLefebvre/Bundle/AsyncTweetsBundle/AlexisLefebvreAsyncTweetsBundle.php
但我无法使用它。
问题
捆绑包安装在 vendor/alexislefebvre/async-tweets-bundle/AlexisLefebvre/Bundle/AsyncTweetsBundle/AlexisLefebvreAsyncTweetsBundle.php
中。正确吗?
我在应用程序/应用程序内核中添加了new AlexisLefebvreBundleAlexisLefebvreAsyncTweetsBundle()
.php但是如果我运行命令,例如。 php app/console cache:clear --env=dev
,它会抛出一个错误:
PHP 致命错误:类 'AlexisLefebvre\Bundle\AlexisLefebvreAsyncTweetsBundle' 在第 20 行的 .../symfony2_AsyncTweetBundle/app/AppKernel.php 中找不到
捆绑包的正确名称是什么?命名空间在捆绑包的类名中AlexisLefebvre
必需的吗?我应该使用 AlexisLefebvre
还是 AlexisLefebvreBundle
作为基本命名空间?"target-dir"
的正确值是多少.我没有找到任何关于 composer.json 文件不同部分之间链接的解释:"name"
、"autoload" : {"psr-0" : {}}
和 "target-dir"
。
我尝试使用"autoload" : {"psr-4" : {...}}
(psr-0
新项目已弃用),更糟糕的是,捆绑包根本没有安装。
查看您的packagist存储库和github存储库。包旁的存储库点似乎没有文件。因此,首先尝试在这两个位置合并文件。
然后,如果您想更改供应商名称/命名空间,请为每个文件更改命名空间以确保统一,并且您已经知道如何创建自己的包。
您仍然可以查看创建自己的作曲家包万一出现混淆。
下面是 Cerad 命名空间下 PersonBundle 的工作示例。
{
"name": "cerad/person-bundle",
"type": "symfony-bundle",
"description": "Symfony Cerad Person Bundle",
"keywords": ["cerad","zayso"],
"homepage": "http://github.com/cerad/PersonBundle",
"license": "MIT",
"authors": [
{
"name": "",
"email": "",
"homepage": "http://zayso.org",
"role": "Developer"
}
],
"require": {
"php": ">=5.3.3"
},
"minimum-stability": "dev",
"autoload": {
"psr-0": { "Cerad\Bundle\PersonBundle\": "" }
},
"target-dir": "Cerad/Bundle/PersonBundle"
}
代码安装在vendor\cerad\person-bundle\Cerad\Bundle\PersonBundle
我有一个 CeradPersonBundle.php 文件命名空间为 Cerad\Bundle\PersonBundle;
所有的路径和选项都令人困惑。 我通过让作曲家直接从 github 而不是 packagist 首先加载来解决这个问题。 这样更容易对 composer.json 进行更改。
解决方案是在 composer.json 中使用 psr-4
:
{
"name" : "alexislefebvre/async-tweets-bundle",
"type" : "symfony-bundle",
"description" : "PHP Twitter reader for asynchronous reading",
"keywords" : ["twitter", "reader", "bundle"],
[...]
"autoload" : {
"psr-4" : {
"AlexisLefebvre\Bundle\AsyncTweetsBundle\" : ""
}
}
}
下面是基础捆绑包类:
<?php
namespace AlexisLefebvreBundleAsyncTweetsBundle;
use SymfonyComponentHttpKernelBundleBundle;
class AsyncTweetsBundle extends Bundle
{
}
我能够通过将其添加到app/AppKernel.php来加载Symfony2中的捆绑包:
new AlexisLefebvreBundleAsyncTweetsBundleAsyncTweetsBundle(),