2017-01-21 47 views
2

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

这是我的composer.json文件

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

这里是我的目录结构:

enter image description here

下面是我的一个类代码:

<?php 

namespace MyDomain\Model; 

class Employee { 

} 
?> 
+0

什么操作系统? – axiac

+0

我使用的是Ubuntu 16.04 –

+0

它运行'composer dump-autoload'后会发现并加载类?奇怪...它不应该找到它们。你是否偶然运行'composer dump-autoload -o'? – axiac

回答

3

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

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

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

因为你在Ubuntu(这是一个基于Linux的操作系统)运行它,PHP无法加载Employee.php文件(因为它不存在)和OS并没有提供它的文件,而不是employee.php

看来您是使用composer update -ocomposer dump-autoload -o生成自动装载机。 -o(短缺--classmap-authoritative)告诉Composer扫描您的案例中composer.jsonapp/)中声明的目录,并创建一个包含它可找到的所有类的类映射。类图是一个列表,它将类名(包含名称空间)映射到文件名(包含目录)。这样,自动装载机就可以准确知道每个类的位置,并且装载速度更快。

以上两段说明了添加新类后需要重新生成自动装载器的原因。

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

修复文件名后,您可以运行composer dump-autoload并忘记它。只要类别和文件名称遵循PSR-4,自动装载机就会找到它们而不再次重新生成。

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

+0

它的工作,并感谢你一个非常明确和准确的答案。 –

相关问题