【问题标题】:Autoloading local composer package自动加载本地作曲家包
【发布时间】:2014-08-16 05:42:40
【问题描述】:

我已经阅读了有关此主题的几个问题,但我仍然无法弄清楚。 我有一个库,我想将其放入 ~/vendor 文件夹并使用内置的 composer 自动加载器。 我的包裹叫“哔”。目录结构是

vendor/beep
vendor/beep/beep
vendor/beep/beep/src
vendor/beep/beep/src/Beep
vendor/beep/beep/src/Beep/Request.php

Request.php 开始于:

namespace Beep;
class Request { ....

composer.json 以

结尾
"autoload": {
   "psr-0": {"Beep\\": "src/Beep"}
}

当我尝试这样做时:

$r = new Beep\Request();

我明白了:

Fatal error: Class 'Beep\Request' not found in ....

所有其他包的自动加载工作正常。 我正在做作曲家更新,它声称它会生成自动加载文件。

知道我做错了什么吗?

谢谢

【问题讨论】:

  • 你的composer.json文件在哪里
  • 你做了composer dump-autoload 吗?
  • composer.json 位于 vendor/beep/beep/composer.json 中,与“src”文件夹处于同一级别。是的,我尝试了 composer dump-autoload 并且它说它生成自动加载文件没有任何错误

标签: php composer-php


【解决方案1】:

当你定义 PSR-0 自动加载时,类名会完全转换为路径和文件名,然后附加到你说的包含前缀的路径上。

相比之下,如果您定义 PSR-4 自动加载,则提到的前缀会从类名中删除,其余部分将转换为路径和文件名,然后附加到路径中。

"psr-0": {"Beep\\": "src/Beep"}

如果您自动加载一个类\Beep\Request,它将在src/Beep/Beep/Request.php 处搜索。

"psr-4": {"Beep\\": "src/Beep"}

这里几乎相同,但是因为“Beep”首先被去掉了类名,所以剩下的类名是Request,然后搜索路径是src/Beep/Request.php

但是建议将路径长度保持在最短,所以我建议这样做:

"psr-4": {"Beep\\": "src"}

然后删除可能为空的“Beep”目录(您不能在此级别拥有Beep.php 文件,因为它不能包含有效的命名空间类,并且任何其他前缀都不匹配)。然后,您的 Beep\Request 课程将位于 src/Request.php

【讨论】:

  • 经过几次尝试,我只是将 "psr-0": {"Beep\\": "src/Beep"} 更改为 "psr-4": {"Beep\\": "src/哔”},执行作曲家转储自动加载,它似乎正在工作。谢谢
  • 我忘了提到在引导程序中我添加了: $loader = require_once DIR 。 '/供应商/autoload.php'; $loader->add('Beep', DIR.'/vendor/beep/beep/src/');
  • 添加是错误的。只要你做对了,Composer 会处理一切......
猜你喜欢
  • 1970-01-01
  • 2013-12-09
  • 2013-03-05
  • 2015-09-24
  • 2018-06-15
  • 2016-07-08
  • 2014-09-14
  • 1970-01-01
相关资源
最近更新 更多