php 找不到Composer class_alias和dump-autoload --classmap-authoritative,类SonataDoctrineSymfonyBundle?

r3i60tvu  于 2023-05-21  发布在  PHP
关注(0)|答案(1)|浏览(160)

我在生产环境中遇到了一个奇怪的问题,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目录中的位置)。

ej83mcc0

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:

$ composer dump-autoload --no-dev --optimize
  • (使用--optimize(简称:-o)命令行参数)*

否则,它可能会使用具体的类而不是class_alias(),但这取决于所使用的库是否支持不同的、更静态的替代方案。如果是这样的话,那么在转储类Map之前生成“真实的的”类可以帮助您保持优化级别2/A。
简体中文
²优化级别2/A:权威类Map
³至少在根据其source撰写此答案时没有,在Support for class aliases #5873中对该主题进行了额外的讨论

相关问题