web-dev-qa-db-ja.com

Symfony4-オートローダーはクラス[…]がファイルで定義されることを期待していました

Symfony 3。*に基づいて構築した古いバンドルを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に3行目を追加しました:

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.jsonautoloadセクションに最初の行を追加しました。

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

        }
    },

バンドルの名前空間は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の下の私のバンドルです:
enter image description here

残念ながら、まだ同じエラーに直面していますが、どうすれば修正できますか。事前に感謝します。

[〜#〜]更新[〜#〜]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
5
SlimenTN

この問題は、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

4
Jakub Krawczyk