【问题标题】:Need to dump autoload to everytime I add a new class每次添加新类时都需要转储自动加载
【发布时间】:2017-06-06 16:01:13
【问题描述】:

每次添加新类时,我都需要转储自动加载器。我正在使用psr-4。我真的不知道为什么我需要这样做。在 psr-4 中它应该自动加载类。我哪里错了?

这是我的 composer.json 文件

{"autoload": {"psr-4": {"MyDomain\\": "app"}}}

这是我的目录结构:

这是我的一门课程的代码:

<?php

namespace MyDomain\Model;

class Employee {

}  
?>

【问题讨论】:

  • 什么操作系统?
  • 我使用的是 Ubuntu 16.04
  • 它会在你运行composer dump-autoload 后找到并加载类?奇怪……它不应该找到他们。你会碰巧运行composer dump-autoload -o吗?
  • 是的,我运行了 dump-autoload -o

标签: php composer-php psr-4


【解决方案1】:

PSR-4(以及 PSR-0)要求类 ClassName 存储在名为 ClassName.php 的文件中。名称区分大小写,并且必须完全匹配。

您项目中的文件名是小写的,类名是混合大小写的。 Windows 和 macOS 上的默认磁盘格式在搜索时不区分大小写。这意味着当程序搜索Employee.php 并且目录中存在文件employee.php 时,搜索成功并且操作系统返回现有文件,即使其名称的大小写与所需文件的大小写不同。在基于 Linux 的操作系统上,默认磁盘格式区分大小写,搜索Employee.php 的程序找不到employee.php

您的composer.json 文件将app/ 目录声明为遵循PSR-4 标准的MyDomain 命名空间的根目录。这足以让自动加载器在需要加载类MyDomain\Models\Employee 时找到文件app/Models/Employee.php

因为您在 Ubuntu(这是一个基于 Linux 的操作系统)上运行它,PHP 无法加载 Employee.php 文件(因为它不存在)并且操作系统没有提供文件 employee.php 来代替。

您似乎使用composer update -ocomposer dump-autoload -o 生成自动加载器。 -o--classmap-authoritative 的缩写)告诉 Composer 扫描在您的情况下在 composer.json (app/) 中声明的目录,并创建一个包含它可以找到的所有类的类映射。类映射是将类名(带有命名空间)映射到文件名(带有目录)的列表。这样,自动加载器就知道在哪里找到每个类,加载速度更快。

以上两段解释了为什么在添加新类后需要重新生成自动加载器。

完成这项工作的正确方法是遵循PSR-4 的要求。更具体地说,MyDomain 下的每个命名空间必须存储在具有相同名称的app/ 的子目录中,包括大小写。每个类都必须存储在正确的子目录中,在一个文件中,该文件与该类(包括大小写)和终止 .php(小写)具有相同的名称。例如,MyDomain\Models\Employee 类必须保留在文件app/Models/Employee.php 中。

修改文件名后,您可以运行composer dump-autoload 并忘记它。只要类名和文件名遵循 PSR-4,自动加载器就会找到它们而无需再次重新生成。

在生产服务器上,您可以运行composer dump-autoload -o 以稍微提高它的速度。只是不要忘记在每次部署后再次运行它(或者,更好的是,将命令包含在部署脚本中)。

【讨论】:

  • 它成功了,感谢您提供非常清晰和准确的答案。
猜你喜欢
  • 2018-08-04
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2019-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
相关资源
最近更新 更多