Файл автозагрузки композитора не работает

Моя спецификация Autoload выглядит следующим образом

"autoload" : { "psr-4" : { "MyMVC\\" : "app/" }, "classmap": [ "app/Controllers", "app/Helpers" ], "files": ["app/routes.php"] }, 

Содержимое файла routes.php:

 <?php use MyMVC\Core\Route; $route = new Route; $route->add('/', 'HomeController@index'); $route->add('about', 'AboutController@index'); $route->add('contact', 'ContactController@index'); 

теперь в моем app/init.php я пытаюсь использовать объект $route но он дает мне ошибку

 Notice: Undefined variable: route in /var/www/html/mymvc/app/init.php on line 29 

Вот как я пытаюсь использовать объект $route .

 /** * Constructor * Bootstrap our application based on the configurations provided */ public function __construct() { // require 'app/routes.php` This will work fine but it should be autoloaded var_dump($route); exit; } 

Я также выполнил команду composer dump-autoload

Автозагрузка не будет работать здесь. PHP может только автозагружать классы. Ваше ожидание того, что app/routes.php будет автоматически app/routes.php , невозможно, поскольку этот файл не содержит объявления класса, и вы не можете запустить его выполнение с использованием ранее неизвестного класса.

Это правда, что Composer будет выполнять этот файл один раз, когда вы включаете vendor/autoload.php – однако это действительно плохое поведение вашего программного обеспечения. Не используйте автозагрузку «файлы» для включения файлов конфигурации. Помните о влиянии производительности, которое может иметь место при использовании в библиотеках. Вы должны избегать его использования в целом, он предназначен для использования для устаревшего кода, который в противном случае не может быть выполнен.

С другой стороны, ваша архитектура сломана. Вы не должны писать класс, который «волшебным образом» знает о конфигурации, просто обращаясь к переменной, которая должна быть инициализирована где-то в другом месте. Хорошим шаблоном было бы передать конфигурацию в качестве параметра конструктору:

 public function __construct ($routes) { $this->routes = $routes; } 

Часть кода, создающего этот класс, должна захватить конфигурацию где-то и передать ее как параметр. Эта концепция называется инверсией управления или инъекции зависимости: классы не ссылаются на другие классы, с которыми им нужно работать, они запрашивают их и получают в качестве параметра.