Composer classmap autoload不会在文件夹中加载新文件

时间:2014-09-02 08:31:36

标签: composer-php autoload

以下问题:我在composer.json中定义了一个类图:

"autoload": {
    "classmap": [
        "app/controllers",
        "app/models",
        "app/helper.php"
    ]   
}

但是,当我在“controllers”或“models”文件夹中创建一个新文件时,它将不会加载它们,而且我总是要编写一个composer dump-autoload。

这是正确的行为吗?我以为编辑器的自动加载器会监视文件夹中的新文件吗?

4 个答案:

答案 0 :(得分:21)

是的,这是正确的行为。如果要自动加载新类,则必须使用PSR-0或PSR-4自动加载。

生成类映射需要Composer知道包含某个类的文件名。这只能通过解析目录中的整个源代码并扫描类,接口和特征定义来完成。

这通常是CPU和I / O密集型任务,因此只有在Composer安装/更新或(按需)转储自动加载器时才会执行此操作,而不是每个require "vendor/autoload.php";都完成。

请注意,类映射自动加载仅适用于未实现至少PSR-0的旧遗留代码库。它不适用于新代码 - 除非您想在开发过程中反复转储自动加载器的价格。

答案 1 :(得分:8)

通过SSH转到服务器的根目录。现在执行以下操作:

  1. 运行ls列出所有文件。
  2. 您将看到composer.lock个文件;使用rm composer.lock命令删除文件。
  3. 现在运行php composer update命令。
  4. 根据您的linux类型,您可能需要运行php-cli composer update

    第3步将创建一个新的composer.lock文件,您的所有课程将再次加载。在您添加新课程时随时执行此操作。

    或:

    1. 运行composer dump-autoload命令。

答案 2 :(得分:0)

正如已经指出的那样,这是正确的行为。如果要自动加载新类,则必须使用PSR-0或PSR-4自动加载。

指定的类映射自动加载类型为composer.json,主要供不遵循PSR-0或PSR-4的旧项目使用。我最近开始从事这样的项目,并且想尝试在创建新类时自动运行composer dump-autoload命令。实际上,在不将所有作曲者源代码包含在项目内部的情况下,这很棘手。我想到这个只是为了提醒开发人员他们需要转储类映射:

$loader = include_once 'vendor/autoload.php';
if ( ! $loader ) {
    throw new Exception( 'vendor/autoload.php missing please run `composer install`' );
}

spl_autoload_register(
    function ( $class ) {
        if ( 'A_Common_Class_Prefix' === substr( $class, 0, 10 ) ) {
            throw new Error( 'Class "' . $class . '"" not found please run `composer dump-autoload`' );
        }
    },
    true
);

这将注册另一个自动加载器,该自动加载器在作曲家的自动加载器之后运行,因此,作曲家未找到的任何类都将传递给它。如果类与前缀匹配,则会引发异常,提醒开发人员重新转储自动加载器并更新类映射。

答案 3 :(得分:0)

对我来说,它在Yii 1类映射中以某种方式也不起作用,当我添加-需要它以及存在的许多其他库时-我不记得确切是我手动编辑了文件还是文件权限被指责,即使出于某种原因,它也没有重新生成,即使我删除了composer.lock并完全擦除了供应商文件夹(据我所知,也许还有一些缓存),但有效的帮助是首先仅隔离地安装了单个库,它生成了class-map,然后在第二步中一次添加所有其他剩余的库,中提琴,一切都可加载。