捆绑服务 - 尝试从命名空间加载 class

Bundle service - Attempted to load class from namespace

在我的 symfony 项目中,我有两个包。 我的第一个包 (Bundle1) 是主包,第二个包 (Bundle2) 用于存储一些服务。

这是我的 service.yml(Bundle2):

services:
   sc_ezpublish_helpers.generic_find:
      class: SC\EzPublishHelpersBundle\Helper\GenericFindHelper

在 Bundle1 中,我这样调用我的服务:

$findHelper = $this->get( 'sc_ezpublish_helpers.generic_find' );

清除缓存后出现此错误:

Attempted to load class "GenericFindHelper" from namespace "SC\EzPublishHelpersBundle\Helper". Did you forget a "use" statement for another namespace?

堆栈跟踪

在 app/cache/dev/appDevDebugProjectContainer.php 的第 20582 行 -

 */
protected function getScEzpublishHelpers_GenericFindService()
{
    return $this->services['sc_ezpublish_helpers.generic_find'] = new \SC\EzPublishHelpersBundle\Helper\GenericFindHelper($this->get('ezpublish.signalslot.repository'), $this->get('ezpublish.config.resolver.core'));
}
/**

这是我在 composer.json

中的自动加载
"autoload": {
    "psr-4": {
        "": "src/"
    },
    "classmap": [ "app/AppKernel.php", "app/AppCache.php" ]
},

这是我的 Bundle2 结构

src/
├── SC
│   └── EzPublishHelpersBundle
│       ├── DependencyInjection
│       │   ├── Configuration.php
│       │   └── SCEzPublishHelpersExtension.php
│       ├── Helpers
│       │   └── GenericFindHelper.php
│       ├── Resources
│       │   └── config
│       │       └── services.yml
│       └── SCEzPublishHelpersBundle.php

你有想法吗?我是不是忘记了什么?

谢谢

目录名和命名空间不匹配。在您的文件夹结构中,它被称为 Helpers(带有复数 s),在您的命名空间中,您使用 Helper。自动加载器使用文件夹名称来匹配 class 名称,因此您必须在自动加载中指定此不匹配:

"autoload": {
    "psr-4": {
        "SC\EzPublishHelpersBundle\Helper\": "src/SC/EzPublishHelpersBundle/Helpers/",
        "": "src/"
    }
}

或(可能是更简单和更常用的方法)将文件夹重命名为 Helper。

顺便说一句,class 名称也是如此。如果您的 GenericHelper class 在文件 GenericFindHelper.php 中,则自动加载器将无法将文件名与 class 名称相匹配。因此,如果保留名称和命名空间对您来说绝对重要,请重命名该文件或为该特定文件使用 classmap-autoloader。

编辑:我刚刚注意到错误的 class 名称只是我回复中的错字。在您的示例中它匹配。