我创建了一个包,将业务逻辑分离为更容易分发的模块。 composer文件如下所示:
{
"name": "aggiq/johnny-cash",
"description": "A collection of controllers, models, migrations, and tests for a phonebanking backend.",
"license": "MIT",
"authors": [ ... ],
"require": {
"illuminate/database": ">=5.5"
},
"require-dev": {
"fzaninotto/faker": "~1.4"
},
"autoload": {
"psr-4": {
"Johnny\\Phonebanking\\": "src/"
}
}
}
我们的源文件确实在src /:
中的src /控制器/ PhonebankController.php SRC /型号/ Phonebank.php ...
我保存并将其推送到我们的gitlab repo,然后将其作为依赖项包含在测试项目中:
{
...,
"repositories": [{
"type": "package",
"package": {
"name": "aggiq/johnny-cash",
"version": "0.1",
"type": "package",
"source": {
"url": "gitlab url",
"type": "git",
"reference": "dev"
}
}
}],
"require": {
"aggiq/johnny-cash": "*",
},
...
}
当我进行作曲家更新时,它成功抓取项目并将其下载到供应商文件夹中:
vendor/aggiq/johnny-cash/Controllers/PhonebankController.php
...
然而,当我查看测试项目的autoload_psr4.php时,它不在那里。我错过了一步吗?
编辑:更新目录以使用大写字母来匹配命名空间,这里是生成的PSR4 php文件:
<?php
// autoload_psr4.php @generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
);
答案 0 :(得分:0)
您已正确地在包composer.json
注册了自动加载:
"autoload": {
"psr-4": {
"Johnny\\Phonebanking\\": "src/"
}
}
这意味着,Johnny\Phonebanking
命名空间中的任何类都将位于src
目录中。 E.g:
Johnny\Phonebanking\SomeClass
=&gt; src/SomeClass.php
Johnny\Phonebanking\SomeNamespace\AnotherClass
=&gt; src/SomeNamespace\AnotherClass.php
如您所见,必须尊重 CapitalLetters 。
说,你应该纠正你的目录的第一个字母,来自:
src/controllers/PhonebankController.php
src/models/Phonebank.php
到
src/Controllers/PhonebankController.php
src/Models/Phonebank.php
答案 1 :(得分:0)
我已经解决了。我们需要做两件事。
由于我们从git服务器加载,因此父级pacakge中指定的存储库类型应为vcs
而不是package
:
“repositories”:[{ “type”:“vcs”, “url”:“git@xxx.git” }]
子包中的包类型应为library
:
“type”:“library”
完成这两项更改后,composer update不仅安装了子包,还安装了它的依赖项,证明它已被作曲家识别。