以下问题:我在composer.json中定义了一个类图:
"autoload": {
"classmap": [
"app/controllers",
"app/models",
"app/helper.php"
]
}
但是,当我在“controllers”或“models”文件夹中创建一个新文件时,它将不会加载它们,而且我总是要编写一个composer dump-autoload。
这是正确的行为吗?我以为编辑器的自动加载器会监视文件夹中的新文件吗?
答案 0 :(得分:21)
是的,这是正确的行为。如果要自动加载新类,则必须使用PSR-0或PSR-4自动加载。
生成类映射需要Composer知道包含某个类的文件名。这只能通过解析目录中的整个源代码并扫描类,接口和特征定义来完成。
这通常是CPU和I / O密集型任务,因此只有在Composer安装/更新或(按需)转储自动加载器时才会执行此操作,而不是每个require "vendor/autoload.php";
都完成。
请注意,类映射自动加载仅适用于未实现至少PSR-0的旧遗留代码库。它不适用于新代码 - 除非您想在开发过程中反复转储自动加载器的价格。
答案 1 :(得分:8)
通过SSH转到服务器的根目录。现在执行以下操作:
ls
列出所有文件。composer.lock
个文件;使用rm composer.lock
命令删除文件。php composer update
命令。 根据您的linux类型,您可能需要运行php-cli composer update
。
第3步将创建一个新的composer.lock
文件,您的所有课程将再次加载。在您添加新课程时随时执行此操作。
或:
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,然后在第二步中一次添加所有其他剩余的库,中提琴,一切都可加载。