【问题标题】:Bundle service - Attempted to load class from namespace捆绑服务 - 尝试从命名空间加载类
【发布时间】:2017-12-29 19:45:44
【问题描述】:

在我的 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' );

清除缓存后出现此错误:

尝试从命名空间“SC\EzPublishHelpersBundle\Helper”加载类“GenericFindHelper”。 您是否忘记了另一个命名空间的“使用”语句?

堆栈跟踪

在 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

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

谢谢

【问题讨论】:

  • 看起来像一个自动加载问题。您能否检查文件夹结构是否与命名空间匹配,并可能在此处从您的 composer.json 添加自动加载部分
  • 我重命名了我的包,也许是因为这个?但是我到处搜索,如果我忘记了什么,我找不到......我用我的自动加载更新了我的消息
  • 在这种情况下,请显示您的文件夹结构。该文件应位于src/SC/EzPublishHelpersBundle/Helper/GenericHelper.php
  • 我添加了我的 Bundle2 结构。我删除了我的旧包(我重命名的那个)并重新创建了一个具有例外名称的新包。但我得到了同样的错误

标签: symfony service bundle


【解决方案1】:

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

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

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

顺便说一下,类名也是如此。如果您的GenericHelper 类在文件GenericFindHelper.php 中,那么自动加载器将无法将文件名与类名匹配。因此,如果保留名称和命名空间对您来说绝对重要,请重命名文件或为此特定文件使用类映射自动加载器。

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

【讨论】:

  • 感谢您的回答,我没有看到。今晚我会尝试并告诉你一切是否正常
  • 它工作正常,非常感谢。我一遍又一遍地检查,并没有看到不匹配...谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-29
  • 2017-03-23
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多