作曲家 - 如何获得项目的根?

时间:2018-03-27 22:04:06

标签: php composer-php

我尝试使用位于vendor/autoload.php的Composer自动加载器。但是,我似乎无法弄清楚如何到达项目的根目录,然后我可以从中导航到vendor/autoload.php。我必须在每个文件中指定相对路径(即../../../vendor/autoload.php)。这似乎是一种非常讨厌的自动加载器方式,因为根据文件的深度,这条路径会有所不同。

有没有办法在没有指定相对路径的情况下到达根目录,或者我是否需要在每个文件中找到x个父目录?

1 个答案:

答案 0 :(得分:3)

PHP无法知道项目的根源是什么"是。您可以在磁盘上拥有任意数量的目录,其中包含几个名为vendor/autoload.php的文件,只有您知道"项目根目录"的特殊之处。所以最终,答案是否定的,没有办法。

但请注意,您只需将自动加载器包含在文件中,这些文件本身不包含在内或自动加载。自动加载器是您加载一次的一部分,作为代码配置/引导的一部分,然后它会加载它们所需的任何类别。

因此,限制不同级别的混乱的方法是仔细构建您的项目。例如:

  • 通过一个或两个"路由器"来路由所有请求,例如单个" index.php"文件。使用Apache mod_rewrite或Nginx等中的等价物来使所有URL实际加载此脚本,然后在脚本中根据URL计算出要运行的代码。您可以使用nikic/FastRoute等库将URL转换为要调用的函数,然后将自动加载。
  • 使用不同的PHP文件,但所有这些文件都在一个相当平坦的目录结构中,因此他们都必须"攀登"达到项目根目录的级别数相同。

同样的原则适用于在命令行脚本或任何其他类型的应用程序中使用:限制或构建"入口点",因为只有那些需要知道加载自动加载器的位置。

如果您已经在每个请求/脚本运行/单元测试/等上加载了某种配置文件,那么将require_once 'vendor/autoload.php';行放在那里可能是明智的。与配置一样,自动加载器是"全局状态"你只想设置一次然后忘记。