Composer 自动加载文件不起作用

Composer autoload file not working

我的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 只能自动加载 classes。您期望 app/routes.php 将自动加载是不可能的,因为该文件不包含 class 声明,并且您无法通过使用以前未知的 class 来触发它的执行。

当您包含 vendor/autoload.php 时,Composer 确实会执行该文件一次 - 但是,这确实是您软件的不良行为。不要使用 "files" 自动加载来包含配置文件。请注意这在库中使用时可能产生的性能影响。您应该完全避免使用它,它旨在用于无法以其他方式工作的遗留代码。

另一方面,您的架构已损坏。您不应该写一个 class,"magically" 仅仅通过访问应该在其他地方初始化的变量就知道配置。一个好的模式是将配置作为参数传递给构造函数:

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

创建此 class 的代码部分应该从某处获取配置并将其作为参数传递。这个概念称为控制反转或依赖注入:类 不要调用他们需要使用的其他 classes,他们会请求它们并将它们作为参数获取。