Это мой первый раз, когда я использовал Composer, и я получаю немного батти, пытаясь понять, почему он не собирает мои пространства имен.
В моем project/
каталоге:
├── composer.json ├── composer.lock ├── composer.phar ├── README.md ├── vendor (truncated) └── src ├── Config.php ├── Handler.php └── Router.php
SRC / config.php
<?php $project_root = realpath(__DIR__ . '/..'); $autoload = $project_root . '/vendor/autoload.php'; ?>
SRC / router.php
<?php namespace Project\Router; include_once("Config.php"); require $autoload; use Project\Handler; Hello::world(); ?>
SRC / handler.php
<?php namespace Project\Handler; include_once("Config.php"); require $autoload; class Hello { public function world() { echo "Hello world!"; } } ?>
composer.json
{ "autoload": { "psr-4": { "Project\\": "src" } } }
http://127.0.1.1/project/src/Router.php
:
Неустранимая ошибка: Не удалось Ошибка: класс 'Project \ Router \ Hello' не найден в /path/to/project/src/Router.php:38(not фактической строке) Трассировка стека: # 0 {main} throw in / path / to /project/src/Router.php в строке 38 (не фактическая строка)
Я могу использовать внешние зависимости, поэтому моя общая настройка Composer выглядит нормально. Я просто не могу понять, где я навожу свои собственные пространства имен.
Кажется, вы неправильно понимаете, как работает PSR4.
"autoload": { "psr-4": { "Project\\": "src" } }
Эта конфигурация означает, что если вы запрашиваете класс Project \ Handler \ Hello из автозагрузчика, он проверяет путь src\Handler\Hello.php
(который не существует).
Если вы измените структуру своей каталогов на следующую, она будет работать:
└── src ├── Config.php ├── Router.php └── Handler └── Hello.php (renamed from Handler.php)
Кроме того, ни Config.php, ни Router.php не содержат классов, которые поражают точку использования автозагрузчика класса.
Дайте это прочитать: http://www.php-fig.org/psr/psr-4/