自动加载器导致类没有找到
我想在我的wordpress项目中包含一个自动加载器。更具体地说,我正在开发一个包含我所有类的Classes /目录的插件。我希望这些类可以通过命名空间访问我的wordpress项目根目录和子文件/文件夹。自动加载器导致类没有找到
我觉得我的composer.json应该照顾自动加载器的实现,尽管我仍然得到一个类未找到致命错误。有其他人遇到这个问题吗?我很欣赏任何建议!
这是我试过到目前为止:
./composer.json
{
"autoload": {
"psr-4": {
"Classes\\": "wp-content/plugins/example-plugin/Classes"
}
},
"require": {}
}
然后...
composer install
./index.php(在WordPress根)
require_once('./vendor/autoload.php');
$foo = new \Classes\MyService();
var_dump($foo); //Fatal error: Uncaught Error: Class 'Classes\MyService' not found
die();
./wp-content/plugins/example-plugin/Classes/MyService.php
namespace Classes;
class MyService {
是的,的确,作曲家应该把你的依赖和自动加载的照顾。你的配置也是正确的。让我们通过一个检查清单:
你的环境是这样的吗?
$ tree
.
├── composer.json
├── composer.phar
├── index.php
├── vendor
│ ├── autoload.php
│ └── composer
│ ├── autoload_classmap.php
│ ├── autoload_namespaces.php
│ ├── autoload_psr4.php
│ ├── autoload_real.php
│ ├── autoload_static.php
│ ├── ClassLoader.php
│ ├── installed.json
│ └── LICENSE
└── wp-content
└── plugins
└── example-plugin
└── Classes
└── MyService.php
您的composer.json看起来像这样吗?
$ cat composer.json
{
"name": "my/project",
"authors": [
{
"name": "My Name",
"email": "[email protected]"
}
],
"autoload": {
"psr-4": {
"Classes\\": "wp-content/plugins/example-plugin/Classes"
}
},
"require": {}
}
你的实现是这样吗?
$ cat wp-content/plugins/example-plugin/Classes/MyService.php
<?php
namespace Classes;
class MyService {
}
最后,你的索引看起来是这样吗?
$ cat index.php
<?php
require_once('./vendor/autoload.php');
$foo = new \Classes\MyService;
var_dump($foo);
如果您对所有这些问题的答案是“是”,那么您是否刷新了自动装载机?
$ composer dump-autoload
如果你的回答是“是”,然后创建一个新的目录,下载composer.phar
,运行php composer.phar init
,这个答案的文件复制并粘贴到该目录,然后再试一次。
如果这样的话,那么diff
这与你的实现。我的猜测是,如果你得到这么多,你有一个流浪的角色 - 可能是Unicode的空白空间 - 藏在你的一个文件中。
感谢您的帮助!你的建议为我做了诀窍:)但是,之前的一个问题是,在添加自动加载器之前,我在'example-plugin'目录内使用了诸如由单独的composer.json/autoload链接的'\ GuzzleHttp \ Client'类。 php文件位于'example-plugin/functions/api'中,解决了上述问题似乎打破了现有的自动加载器,为什么会出现这种情况,以及我将如何维持现有的功能? – AnchovyLegend
您可以将自动载入定义移动到api子目录的composer.json中,也可以将其自动载入移动到新的composer.json中,也可以确保各自的代码路径使用正确的autoload.php。然而,它震动了,最好让所有的代码同意使用相同的composer.json。 – bishop
我很困惑。为了澄清,GuzzleHttp \ Client是由作曲家安装的依赖项,而不是我编写的类。它位于'example-plugin/functions/api'内的'vendor'目录内,该目录与api目录本地的composer.json文件位置相同。我试着将psr-4定义移动到那个文件中,但没有成功......不知道如何让'/ vendor'类和私人类同时工作 – AnchovyLegend
PSR-4是否要求该文件为'./wp-content/plugins/example-plugin/Classes/Api/MyService.php'(特别注意'Api'目录)? – Phil
嗨菲尔,我欣赏这些建议,我已经做了这两个改动,现在仍然是运气:/(看编辑) – AnchovyLegend
你是否已经执行了'dump-autoload'作曲者任务,因为你添加了'autoload'字段? – Phil