我在生产环境中遇到了一个奇怪的问题,composer dump-autoload --no-dev --classmap-authoritative
生成了一个classmap自动加载器,其中使用class_alias
定义的类不会被转储。例如,从一真实的Symfony Bundle中获取以下两个文件:
***SonataDoctrineBundle**是真实的的类
***SonataDoctrineSymfonyBundle**使用class_alias
定义
自动加载器包含第一类:
root@09cc7fdd330c:/var/www/html# cat vendor/composer/autoload_classmap.php | grep -i SonataDoctrineBundle
'Sonata\\Doctrine\\Bridge\\Symfony\\Bundle\\SonataDoctrineBundle' => $vendorDir . '/sonata-project/doctrine-extensions/src/Bridge/Symfony/Bundle/SonataDoctrineBundle.php',
'Sonata\\Doctrine\\Bridge\\Symfony\\SonataDoctrineBundle' => $vendorDir . '/sonata-project/doctrine-extensions/src/Bridge/Symfony/SonataDoctrineBundle.php',
但不是第二个
因此,我在生产中遇到了错误:
PHP致命错误:未捕获错误:/var/www/html/src/kernel.php:38/48/48/48/48/48/48/48/48
问题是:为什么我不能自动加载类SonataDoctrineSymfonyBundle
?
(当然,我可以修改这个特定的类来解决这个问题,但是我不知道class_alias
在整个vendor
目录中的位置)。
1条答案
按热度按时间ej83mcc01#
带有
--classmap-authoritative
命令行参数的composer dump-autoload
命令可以防止类Map旁边的任何其他自动加载。此机制是Composer Autoloader optimization¹的一部分,更具体地说,它是 * 优化级别2/A:权威级Map *²。
这个选项[-a,--classmap-authoritative]表示如果在classmap中没有找到某个东西,那么它就不存在,自动加载程序不应该尝试根据PSR-4规则查找文件系统。
当Composer生成class-map时,它不会考虑带有
class_alias()
指令的文件³。这意味着,名称仅作为class_alias()
调用的参数出现的类不会**成为类Map的一部分。由于您似乎不需要使用此自动加载优化,并且它与
class_alias
的使用不兼容,因此另一种选择是仅使用Composer自动加载优化级别1:--optimize
(简称:-o
)命令行参数)*否则,它可能会使用具体的类而不是
class_alias()
,但这取决于所使用的库是否支持不同的、更静态的替代方案。如果是这样的话,那么在转储类Map之前生成“真实的的”类可以帮助您保持优化级别2/A。简体中文
²优化级别2/A:权威类Map
³至少在根据其source撰写此答案时没有,在Support for class aliases #5873中对该主题进行了额外的讨论