Composer自动加载文件无法正常工作

时间:2015-09-26 21:23:07

标签: php composer-php 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

1 个答案:

答案 0 :(得分:0)

自动加载在这里不起作用。 PHP只能自动加载类。您不希望app/routes.php被自动加载,因为该文件不包含类声明,并且您无法使用以前未知的类触发它的执行。

当你包含vendor/autoload.php时,Composer确实会执行一次该文件 - 但是,这对你的软件来说是非常糟糕的行为。不要使用&#34;文件&#34;自动加载以包含配置文件。注意在图书馆中使用时可能产生的性能影响。您应该完全避免使用它,它应该用于遗留代码,否则无法使其工作。

另一方面,您的架构已经崩溃。你不应该写一个神奇的课程#34;通过访问应该在其他地方初始化的变量来了解配置。一个好的模式是将配置作为参数传递给构造函数:

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

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