【问题标题】:Symfony 4 - The autoloader expected class […] to be defined in fileSymfony 4 - 自动加载器预期的类 […] 将在文件中定义
【发布时间】:2018-07-28 17:35:16
【问题描述】:

我正在尝试将在 Symfony 3.* 上构建的旧 Bundle 添加到 Symfony 4,但我收到此错误:

自动加载器预期的类 "App\SBC\TiersBundle\Controller\ChantierController" 定义在 文件 “/Applications/MAMP/htdocs/Projects/HelloSymfony4/vendor/composer/../../src/SBC/TiersBundle/Controller/ChantierController.php”。 找到文件但类不在其中,类名或 命名空间可能有错字 /Applications/MAMP/htdocs/Projects/HelloSymfony4/config/services.yaml (在资源中加载 “/Applications/MAMP/htdocs/Projects/HelloSymfony4/config/services.yaml”)。

框架似乎无法识别包的命名空间,所以我执行了以下步骤:
config/bundle.php 我添加了第三行:

return [
    Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true],
    Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true],
    \SBC\TiersBundle\TiersBundle::class => ['all' => true], // this one
    Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true],
];

composer.json 中,我在autoload 部分添加了第一行:

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

        }
    },

因为我的Bundle的命名空间以SBC\开头,而我已经在控制台启动了composer dump-autoload

<?php

namespace SBC\TiersBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class TiersBundle extends Bundle
{
}

ChantierController.php

namespace SBC\TiersBundle\Controller;

use SBC\TiersBundle\Entity\Chantier;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;


class ChantierController extends Controller
{
...
}

这是我在 /src 下的 Bundle:

不幸的是仍然面临同样的错误,我该如何解决它并提前感谢。

更新config/services.yaml:

# Put parameters here that don't need to change on each machine where the app is deployed
# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration
parameters:

services:
    # default configuration for services in *this* file
    _defaults:
        autowire: true      # Automatically injects dependencies in your services.
        autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
        public: false       # Allows optimizing the container by removing unused services; this also means
                            # fetching services directly from the container via $container->get() won't work.
                            # The best practice is to be explicit about your dependencies anyway.

    # makes classes in src/ available to be used as services
    # this creates a service per class whose id is the fully-qualified class name
    SBC\:
        resource: '../src/SBC/*'
        exclude: '../src/SBC/TiersBundle/{Entity,Migrations,Tests}'

    SBC\TiersBundle\Controller\:
        resource: '../src/SBC/TiersBundle/Controller'
        tags: ['controller.service_arguments']

    App\:
        resource: '../src/*'
        exclude: '../src/{Entity,Migrations,Tests}'

    # controllers are imported separately to make sure services can be injected
    # as action arguments even if you don't extend any base controller class
    App\Controller\:
        resource: '../src/Controller'
        tags: ['controller.service_arguments']

    # add more service definitions when explicit configuration is needed
    # please note that last definitions always *replace* previous ones

【问题讨论】:

  • 你能告诉我们ChantierController.php的内容吗?
  • @JakubKrawczyk 我已经更新了我的问题,请看一下。

标签: php autoload symfony4


【解决方案1】:

这个问题很可能是由 Symfony 配置和命名空间冲突引起的。首先你需要调整你的config/services.yaml

SBC\:
    resource: '../src/SBC/*'
    exclude: '../src/SBC/TiersBundle/{Entity,Migrations,Tests,Kernel.php}'

SBC\TiersBundle\Controller\:
    resource: '../src/SBC/TiersBundle/Controller'
    tags: ['controller.service_arguments']

App\:
    resource: '../src/*'
    exclude: '../src/{SBC,Entity,Migrations,Tests,Kernel.php}'

这样,您将为命名空间定义默认值,并防止默认命名空间App 在生成自动加载类时包含您的目录。注意如果使用注解路由,还需要调整config/routes/annotations.yaml

sbc_controllers:
    resource: ../../src/SBC/TiersBundle/Controller/
    type: annotation

所以路线是正确生成的。执行这些步骤后,再次运行 composer dump-autoload 并清除 Symfony 的缓存。

如果您以后遇到其他问题,这可能会有所帮助:https://github.com/symfony/symfony/blob/master/UPGRADE-4.0.md

【讨论】:

  • 感谢您的回答,我会尝试并给您反馈,对于我使用 yaml 的类型而不是 annotation 的路由,所以我应该将类型更改为 yaml ?
  • 如果您使用yaml 定义您的路线,则无需更改任何内容。
  • 更改 services.yaml 后,我收到此异常:`为“SBC\”导入类时“排除”模式无效:确保您的“排除”模式(../src/{Entity,Migrations ,Tests,Kernel.php}) 是 /Applications/MAMP/htdocs/Projects/HelloSymfony4/config/services.yaml 中“资源”模式 (../src/SBC/*) 的子集(在资源中加载"/Applications/MAMP/htdocs/Projects/HelloSymfony4/config/services.yaml").``
  • 对不起,我犯了一个错误并更新了我的答案。我相信您需要为 `SBC` 命名空间排除 ../src/SBC/TiersBundle/{Entity,Migrations,Tests,Kernel.php}
  • 现在出现一个新错误:Class Symfony\Component\Form\AbstractType not found in /Applications/MAMP/htdocs/Projects/HelloSymfony4/config/services.yaml(在资源“/Applications/ MAMP/htdocs/Projects/HelloSymfony4/config/services.yaml")。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-24
  • 2019-06-26
相关资源
最近更新 更多