错误:自动加载器预期的类...将在文件中定义 inSymfony 3.4

问题描述

对于Symfony 4.0的更新,我在services.yml中添加了“_default”和“AppBundle”并验证了操作,但是出现了如下错误
我有两个包,想实现每个包的自动接线。
有什么问题吗?
https://symfony.com/doc/4.0/service_container/3.3-di-changes.html

错误代码

The autoloader expected class "App\Sp\AppBundle\AppBundle" to   
  be defined in file "/home/vagrant/Symfony2/vendor/composer/../../src/App/Sp/AppBundle/AppBundle.PHP". The file was found but the class was not in it,the class name or namespace probably has a typo.  

services.yml

services:
    _defaults:
        autowire: true
        autoconfigure: true
        public: false

    AppBundle\:
        resource: '../../src/App/Sp/AppBundle/*'
        exclude: '../../src/App/Sp/AppBundle/{Entity,Repository,AppBundle.PHP}'

    CommonBundle\:
        resource: '../../src/App/Sp/CommonBundle/*'
        exclude: '../../src/App/Sp/CommonBundle/{Entity,Repository}'

AppBundle.PHP

<?PHP
namespace App\Sp\AppBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class AhiSpAdminBundle extends Bundle
{
}

解决方法

作曲家

Symfony Flex 中的 composer.json PSR-4 自动加载器默认为 App 路径中的 /src 应用命名空间。 App 命名空间将应用于 src/ 目录中的所有子目录和文件。

composer.json

    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    },

Symfony 命名约定

Symfony 命名约定还要求 *Bundle.php 文件驻留在同名 [sic][sic] 的命名空间中。这由供应商或类别名称 (Sp) 和命名空间 (AhiSpAdminBundle) 组成,以生成 SpAhiSpAdminBundle

| Namespace Bundle       | Class Name     |
|------------------------|----------------|
| Acme\Bundle\BlogBundle | AcmeBlogBundle |
| Acme\BlogBundle        | AcmeBlogBundle |
// src/Acme/BlogBundle/AcmeBlogBundle.php
namespace App\Acme\BlogBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class AcmeBlogBundle extends Bundle
{
}

PSR-4 自动加载

由于命名空间是 App\Sp\AhiSpAdminBundle,所以需要更改文件名和目录以分别匹配命名空间和 Symfony 包类命名约定为 src/Sp/AhiSpAdminBundle/SpAhiSpAdminBundle.php

重命名文件以匹配 PSR-4 自动加载器的类名。

mv src/Sp/AppBundle/AppBundle.php src/Sp/AppBundle/SpAhiSpAdminBundle.php

重命名目录以匹配 PSR-4 自动加载器的命名空间。

mv src/Sp/AppBundle src/Sp/AhiSpAdminBundle

Symfony 服务

修复包的命名空间和类名以符合 Symfony naming conventions

// src/Sp/AhiSpAdminBundle/SpAhiSpAdminBundle.php
namespace App\Sp\AhiSpAdminBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class SpAhiSpAdminBundle extends Bundle
{
  //...
}

然后更新您的服务定义以匹配与 Symfony 兼容的 PSR-4 路径。

# config/services.yaml
services:
    _defaults:
        autowire: true
        autoconfigure: true
        public: false

    App\Sp\AhiSpAdminBundle\:
        resource: '../src/Sp/AhiSpAdminBundle/*'
        exclude: '../src/Sp/AhiSpAdminBundle/{Entity,Repository,SpAhiSpAdminBundle.php}'

    App\Sp\CommonBundle\:
        resource: '../src/Sp/CommonBundle/*'
        exclude: '../src/Sp/CommonBundle/{Entity,Repository}'

清理

生成自动加载文件。

composer dump-autoload

清除并预热 Syfmony 缓存。

rm -rf var/cache/dev
bin/console --env=dev cache:warmup

如果需要,对 CommonBundle 命名空间、类名和 src/Sp/CommonBundle/SpCommonBundle.php 的文件名重复此过程,或者按照命名约定进行重构以实现所需的最终结果。

// src/Sp/CommonBundle/SpCommonBundle.php
namespace App\Sp\CommonBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class SpCommonBundle extends Bundle
{
  //...
}

虽然供应商/类别名称 (Sp) 在捆绑类别中是可选的 名称,带有非描述性名称,如 AdminBundleCommonBundle,最佳做法是将类别包含在 包名称,以确保没有命名冲突并更好地 在调试和单元测试时区分它们。

,

我对 Symfony 有点熟悉,但我的经验是开发现有项目而不是创建新项目,而是查看错误:... The file was found but the class was not in it,the class name or namespace probably has a typo.

我认为这可以解释它吗?文件名是 AppBundle.php,但类名是 AhiSpAdminBundle。 PHP 通常对文件名和类名使用相同的名称,因此我认为您应该将类​​名重命名为 AppBundle 或仅重命名文件名,基本上确保它们使用相同的名称。 (我假设 Symfony 根据此“约定”在 AppBundle 文件中查找名为 AppBundle.php 的类)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...