Проблема с настройкой диспетчера сущностей, отличного от значения по умолчанию, в провайдере пользователя для Symfony 5 - PullRequest
1 голос
/ 16 апреля 2020

Я посмотрел на это сообщение , но моя проблема немного отличается, и многое в symfony компоненте безопасности изменилось для версии 5.

Итак, я пытаюсь установить сущность менеджер, отличный от настроек по умолчанию в пользовательском провайдере Я создал два соединения, используя документацию: https://symfony.com/doc/current/doctrine/multiple_entity_managers.html

doctrine:
    dbal:
        default_connection: default
        connections:
            default:
                url: '%env(resolve:DATABASE_URL)%'
            b2b:
                url: '%env(resolve:DATABASE_B2B_URL)%'
            users:
                url: '%env(resolve:DATABASE_USERS_URL)%'

        # IMPORTANT: You MUST configure your server version,
        # either here or in the DATABASE_URL env var (see .env file)
        #server_version: '5.7'
    orm:
        auto_generate_proxy_classes: true
        default_entity_manager: default
        entity_managers:
            default:
                naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
                auto_mapping: false
                connection: default
                mappings:
                    App:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Entity/Main'
                        prefix: 'App\Entity\Main'
                        alias: Main
            b2b:
                connection: b2b
            users:
                connection: users
                mappings:
                    Users:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Entity/Users'
                        prefix: 'App\Entity\Users'
                        alias: Users

Далее я изменяю свой security.yaml и добавляю manager_name: users - точно так же, как в документации:

security:
    encoders:
        App\Entity\Users\User:
            algorithm: auto

    # https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
    providers:
        # used to reload user from session & other features (e.g. switch_user)
        app_user_provider:
            entity:
                class: App\Entity\Users\User
                property: email
                manager_name: users
    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            anonymous: lazy
            provider: app_user_provider
            guard:
                authenticators:
                    - App\Security\LoginFormAuthenticator
            logout:
                path: app_logout
                # where to redirect after logout
                # target: app_any_route

            # activate different ways to authenticate
            # https://symfony.com/doc/current/security.html#firewalls-authentication

            # https://symfony.com/doc/current/security/impersonating_user.html
            # switch_user: true

    # Easy way to control access for large sections of your site
    # Note: Only the *first* access control that matches will be used
    access_control:
        # - { path: ^/admin, roles: ROLE_ADMIN }
        # - { path: ^/profile, roles: ROLE_USER }

Несмотря на вышеуказанные настройки компонента безопасности, попробуйте загрузить класс из менеджера сущностей по умолчанию:

[2020-04-16T05:53:55.276798+00:00] request.CRITICAL: Uncaught PHP Exception Doctrine\Persistence\Mapping\MappingException: "The class 'App\Entity\Users\User' was not found in the chain configured namespaces App\Entity\Main" at /home/budmechzz/public_html/rfm.computermedia.com.pl/vendor/doctrine/persistence/lib/Doctrine/Persistence/Mapping/MappingException.php line 23 {"exception":"[object] (Doctrine\\Persistence\\Mapping\\MappingException(code: 0): The class 'App\\Entity\\Users\\User' was not found in the chain configured namespaces App\\Entity\\Main at /home/budmechzz/public_html/rfm.computermedia.com.pl/vendor/doctrine/persistence/lib/Doctrine/Persistence/Mapping/MappingException.php:23)"} []

Что я делаю не так?

1 Ответ

0 голосов
/ 17 апреля 2020

Хорошо, я думаю, что решил проблему.

Причиной был класс /src/Security/LoginFormAuthenticator.php (автоматически сгенерированный php bin / console make: auth) в 68 строке:

$user = $this->entityManager->getRepository(User::class)->findOneBy(['email' => $credentials['email']]);

This Линия пытается получить пользователя от менеджера сущностей по умолчанию. Я не знаю, почему индикация менеджера не помогает, например. $ this-> entityManager-> getRepository (User :: class, 'users')

Поэтому я изменяю __constructor в /src/Security/LoginFormAuthenticator.php и получаю менеджер сущностей из ManagerRegistry (это было ранее получено из EntityManagerInterface). Это решает мою проблему с логином:)

use Doctrine\Common\Persistence\ManagerRegistry;

public function __construct(ManagerRegistry $managerRegistry, UrlGeneratorInterface $urlGenerator, CsrfTokenManagerInterface $csrfTokenManager, UserPasswordEncoderInterface $passwordEncoder)
{
    $this->entityManager = $managerRegistry->getManager('users');
    $this->urlGenerator = $urlGenerator;
    $this->csrfTokenManager = $csrfTokenManager;
    $this->passwordEncoder = $passwordEncoder;
}

Надеюсь, это кому-нибудь пригодится

...