【问题标题】:How can I check if PHP Composer autoload is working?如何检查 PHP Composer 自动加载是否正常工作?
【发布时间】:2021-10-16 00:47:02
【问题描述】:

我正在尝试将使用 PHP Composer 的小型 Web 应用程序从旧的过时服务器转移到新服务器。

在新服务器上,我已经运行 composer install 来安装 composer.lock 文件中的依赖项。

Web 应用程序需要一个配置文件来设置自己(并不是说它做了很多设置),其中包括行

require_once __DIR__ . '/vendor/autoload.php';

...哪个应该相对于配置文件定位自动加载器,并使系统知道 Composer 安装的包。

但是,这似乎无法正常工作,因为当网络应用程序尝试使用 SwiftMailer(通过 Composer 安装)时,它会说:

PHP 致命错误:未捕获错误:调用未定义方法 Swift_SmtpTransport::newInstance()

...在调用它的文件中,这显然表明它不知道它并且找不到它。

有没有一种方法可以有意义地检查自动加载器包含的结果是什么,看看它在做什么(或没有做什么)?

【问题讨论】:

  • newInstance() 不是该类中的当前方法。看来您的代码需要的 Swift 版本比新服务器安装的版本旧。如果您在新服务器上运行 composer update 或者如果项目的存储库收到从未安装到旧服务器的提交,则可能会发生这种情况。我会在两台服务器上运行 composer show 以查看 Swift 的版本是否匹配。您也许可以更新 composer.json 以将其锁定为旧版本。
  • 我还要确保您在两台服务器上运行相同的 PHP 版本,这可能会导致依赖版本不匹配。实现你现在所追求的最可靠的方法是使用 Docker 或其他东西,这样你就可以隔离所有依赖项、版本等
  • @AlexHowansky,很好,谢谢!我正在根据 SwiftMailer v6 文档审查站点代码,但是在漫长的一天结束时,总体进展相当缓慢,我想我的眼睛现在看到了他们想看到的东西,而我没有注意到这些(微妙的)方法变化!我已经更新了代码(正如我所说,幸运的是它是一个简单的应用程序!)现在它可以工作了,所以我认为 Composer 可能是问题的原因是错误的!
  • @dir,将这些旧的内部应用程序从旧的 PHP 5 服务器(和旧的操作系统)拖到新的 PHP 7 服务器是移动它们的主要原因。在一个理想的世界里,我们会有时间和资源来研究 Docker 等,但遗憾的是,今天不是我们的日子!谢谢! ;-)
  • 感谢@AlexHowansky,我的问题现在得到了解决(事实证明,我对可能导致问题的原因的初步诊断实际上是不正确的)。我现在结束这个问题的合适的“SO方式”是什么?我应该删除它吗?

标签: php composer-php


【解决方案1】:

确保在你的类中添加一个 use 语句。您可以安排您的类并为您的类命名空间,然后允许作曲家也自动加载您的类。 你可以告诉作曲家你的类是如何根据命名空间排列的,如下所示: 在 composer.json 文件的自动加载部分编辑它以了解类的命名空间是如何排列的

"autoload": {
    "psr-4": {
        "App\\": "src/",
        "Mynamespace\\": "lib/src/ProjectSrc/"
    }
},

自动加载部分现在告诉作曲家 ProjectSrc 文件夹中的类将具有 Mynamespace 的根命名空间。根据这些信息,composer 可以确定目录树中的所有其他子命名空间。这不会自动发生,composer 必须使用composer dump-autoload 命令重建其类映射。

【讨论】:

  • 请分享更多细节。这如何解决给定的错误消息?
  • @Alex Howansky 已经回答了这个问题。
猜你喜欢
  • 2013-08-10
  • 2019-01-01
  • 2015-07-25
  • 1970-01-01
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
  • 2014-01-11
相关资源
最近更新 更多