Моя спецификация 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; }
Часть кода, создающего этот класс, должна захватить конфигурацию где-то и передать ее как параметр. Эта концепция называется инверсией управления или инъекции зависимости: классы не ссылаются на другие классы, с которыми им нужно работать, они запрашивают их и получают в качестве параметра.