Исходный composer.json
"autoload": {
"psr-4": { "": "src/" },
"classmap": [ "app/AppKernel.php", "app/AppCache.php" ],
"exclude-from-classmap": [ "/tests/" ]
},
"autoload-dev": {
"psr-4": { "tests\\": "tests/" }
}
Новый composer.json
"autoload": {
"psr-4": {
"AppBundle\\": "src/AppBundle",
"TOTO\\": "src/TOTO"
},
"classmap": [
"app/AppKernel.php",
"app/AppCache.php" ],
"exclude-from-classmap": [ "/tests/" ]
},
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/"
},
"files": [
"vendor/symfony/symfony/src/Symfony/Component/VarDumper/Resources/functions/dump.php"
]
},
Моя черта определена в tests\TOTO\Services\InvokeMethodTrait и вызывается другими тестами, такими как tests\TOTO\Services\ConversationServiceTest, поскольку это изменение для оптимизации автозагрузчика я получаю Fatal error: Trait 'tests\TOTO\Services\InvokeMethodTrait' not found in /var/www/symfony/tests/TOTO/Services/ConversationServiceTest.php on line 17. Раньше он работал правильно, и я ничего не менял в связанных классах.
Любая идея?




Оригинальная часть composer.json содержала:
"psr-4": { "tests\\": "tests/" }
и новый:
"psr-4": {
"Tests\\": "tests/"
}
Можно увидеть изменение в случае пространства имен tests. Это не проблема для PHP (изначально), поскольку пространства имен и классы нечувствительны к регистру (отличный ответ с обзором чувствительности к регистру PHP https://stackoverflow.com/a/33273959/5264262). Но автозагрузчик композитора получает это неизвестное имя класса в виде строки и преобразует все эти полностью определенные имена классов в некоторые пути к require файлу, поэтому процесс чувствителен к регистру. Было некоторое обсуждение открытого вопроса на https://github.com/composer/composer/issues/2767, касающегося этой темы.
Последний момент: наши пространства имен и именование классов в composer.json должны быть совместимы с регистром.
поможет ли это обсуждение на github? github.com/composer/composer/issues/2767