自动加载器导致类没有找到

问题描述:

我想在我的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 { 
+0

PSR-4是否要求该文件为'./wp-content/plugins/example-plugin/Classes/Api/MyService.php'(特别注意'Api'目录)? – Phil

+0

嗨菲尔,我欣赏这些建议,我已经做了这两个改动,现在仍然是运气:/(看编辑) – AnchovyLegend

+0

你是否已经执行了'dump-autoload'作曲者任务,因为你添加了'autoload'字段? – Phil

是的,的确,作曲家应该把你的依赖和自动加载的照顾。你的配置也是正确的。让我们通过一个检查清单:

你的环境是这样的吗?

$ 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的空白空间 - 藏在你的一个文件中。

+0

感谢您的帮助!你的建议为我做了诀窍:)但是,之前的一个问题是,在添加自动加载器之前,我在'example-plugin'目录内使用了诸如由单独的composer.json/autoload链接的'\ GuzzleHttp \ Client'类。 php文件位于'example-plugin/functions/api'中,解决了上述问题似乎打破了现有的自动加载器,为什么会出现这种情况,以及我将如何维持现有的功能? – AnchovyLegend

+0

您可以将自动载入定义移动到api子目录的composer.json中,也可以将其自动载入移动到新的composer.json中,也可以确保各自的代码路径使用正确的autoload.php。然而,它震动了,最好让所有的代码同意使用相同的composer.json。 – bishop

+0

我很困惑。为了澄清,GuzzleHttp \ Client是由作曲家安装的依赖项,而不是我编写的类。它位于'example-plugin/functions/api'内的'vendor'目录内,该目录与api目录本地的composer.json文件位置相同。我试着将psr-4定义移动到那个文件中,但没有成功......不知道如何让'/ vendor'类和私人类同时工作 – AnchovyLegend