我正在开发一个使用独白的项目,它需要Psr/log。当我通过自动加载使用独白时,它会抱怨缺少PsrLogLoggerInterface。所以我查看了编译器生成的autoload_namespaces.php,我找不到Psr被注册了。
这是我的vendor/autoload_namespaces.php的内容
return array(
'Symfony\Component\Process' => $vendorDir . '/symfony/process/',
'Monolog' => $vendorDir . '/monolog/monolog/src/',
'Imagine' => $vendorDir . '/imagine/Imagine/lib/',
'Gedmo' => $vendorDir . '/gedmo/doctrine-extensions/lib/',
'Gaufrette' => $vendorDir . '/knplabs/gaufrette/src/',
'Evenement' => $vendorDir . '/evenement/evenement/src',
'Doctrine\ORM' => $vendorDir . '/doctrine/orm/lib/',
'Doctrine\DBAL' => $vendorDir . '/doctrine/dbal/lib/',
'Doctrine\Common' => $vendorDir . '/doctrine/common/lib/',
'Assetic' => $vendorDir . '/kriswallsmith/assetic/src/',
'Analog' => $vendorDir . '/analog/analog/lib/',
);
应该为所有在其编写器中定义了{autolload}的项目注册名称空间吗?json文件?(我检查了独白和Psr/Log,它们都定义了{autolload})
还是我对作曲家的理解有误?
您需要显式添加
"psr/log": "1.0.0"
编辑器中的。Json要求块。项目monolog/monolog
不需要psr/log
[你可以在独白的作曲家中验证。json文件].
然后运行composer update
来更新你的自动加载器文件
[UPDATE]出错了。
我正在使用独白1.2。*不需要psr/log
。独白后1.3。*,它需要psr/log
。在这种情况下,编写器应该在vendor/autoload_namespaces.php中加载psr/log
命名空间。
例如,我刚刚更新了我的作曲家。Json有
"monolog/monolog": "1.3.*",
在require块中。然后运行composer update monolog/monolog
[您可以再次运行此命令,看看是否解决了您的问题]
Loading composer repositories with package information Updating dependencies (including require-dev) - Installing psr/log (1.0.0) Loading from cache - Removing monolog/monolog (1.2.1) - Installing monolog/monolog (1.3.1) Downloading: connection... Downloading: 100%
然后在我的vendor/composer/autoload_namespaces.php中,我找到了这个合适的条目:
'Psr\Log\' => $vendorDir . '/psr/log',
这应该可以工作。有时候我也会直接输入
composer dump-autoload
我实际上对autoload_namespaces.php的数量感到困惑。我在我的问题中发布的一个是在vendor/
,然后我在vendor/.composer/
中找到了另一个,最后在 vendor/composer/
中找到了正确的一个。
很抱歉回答我自己的(愚蠢的)问题,但这是值得一提的,以防其他一些开发人员有同样的麻烦。
感谢@川马的回答。
Composer在项目的composer.json
文件中基于autoload
注册类,例如
{
"autoload": {
"classmap": [
"path/to/FirstClass.php",
"path/to/SecondClass.php"
]
}
}
通常composer update
会自动生成autoload_namespaces.php
列出你的应用程序可以使用的所有名称空间(除非你使用多个自动加载器)。
如果名称空间缺失,下面是直接更新编写器自动加载器的命令:
composer dump-autoload -o
然后你需要确保在脚本的顶部包含自动加载器:
<?php
require_once __DIR__ . '/vendor/autoload.php';
参见:如何使用Composer直接自动加载类?
如果仍然失败,请仔细检查失败项目的composer.json
文件中的语法(特别是autoload
部分)。要调试,请尝试在-vvv
或XDebug下运行composer。