Я использую следующую структуру каталогов, основанную на моем понимании того, как работают пространства имен в PHP:
project_root
app/
| lib/
| | MyCompany/
| | | Utility/
| | | | Logger.php
| | | Core/
| | | | User.php
vendor/
composer/
symfony/
guzzle/
bootstrap.php
composer.json
Согласно спецификации PSR-4, полное имя класса имеет следующую форму:
\<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>
Вопрос 1:
Из моей структуры каталогов выше, верно ли предположение ниже?
Вопрос 2:
Если мой файл bootstrap.php содержит следующее:
<?php
require 'vendor/autoload.php';
Как бы я настроить автозагрузку раздел composer.json для автозагрузки классов в каталоге MyCompany? Так что я смогу создать экземпляр Logger в bootstrap.php
Взято из документации, которую вы связали:
{
"autoload": {
"psr-4": {
"MyCompany\\": "app/lib/MyCompany/",
}
}
}
Это говорит само за себя, оно просто говорит автозагрузчику, что app/lib/MyCompany
является корнем для MyCompany\
Пространство имен.
Тогда вы сможете использовать класс как \MyCompany\Utility\Logger
,
Обратите внимание, что в PSR-4, в отличие от PSR-0, вы обычно опускаете MyCompany
из структуры каталогов, и просто используйте app/lib/
,
Других решений пока нет …