Как Symfony узнает, какой ObjectManager нужно создать

142
21 августа 2021, 15:50

Вопрос возможно странный, но все же. Имеем конфиг из документации Symfony 4:

doctrine:
    dbal:
        default_connection: default
        connections:
            default:
                # configure these for your database server
                url: '%env(DATABASE_URL)%'
                driver: 'pdo_mysql'
                server_version: '5.7'
                charset: utf8mb4
            customer:
                # configure these for your database server
                url: '%env(DATABASE_CUSTOMER_URL)%'
                driver: 'pdo_mysql'
                server_version: '5.7'
                charset: utf8mb4
    orm:
        default_entity_manager: default
        entity_managers:
            default:
                connection: default
                mappings:
                    Main:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Entity/Main'
                        prefix: 'App\Entity\Main'
                        alias: Main
            customer:
                connection: customer
                mappings:
                    Customer:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Entity/Customer'
                        prefix: 'App\Entity\Customer'
                        alias: Customer

здесь два менеджера customer и default. Далее документация говорит, хотите юзать, используйте:

// ...
use Doctrine\ORM\EntityManagerInterface;
class UserController extends AbstractController
{
    public function index(EntityManagerInterface $entityManager)
    {
        // These methods also return the default entity manager, but it's preferred
        // to get it by injecting EntityManagerInterface in the action method
        $entityManager = $this->getDoctrine()->getManager();
        $entityManager = $this->getDoctrine()->getManager('default');
        $entityManager = $this->get('doctrine.orm.default_entity_manager');
        // Both of these return the "customer" entity manager
        $customerEntityManager = $this->getDoctrine()->getManager('customer');
        $customerEntityManager = $this->get('doctrine.orm.customer_entity_manager');
    }
}

Вопрос в следующем, как Symfony знает, экземпляр какого класса(т.е. какой Manager) необходимо передать аргументом в метод индекс? В конфиге указано, что дефолтный, но нигде нет сопоставления имени default с конкретным Manager-ом.

Answer 1

Доктрина создает несколько экземпляров одного класса менеджера и кладет их в реестр под именами из конфига. Механизм приведен в https://ru.stackoverflow.com/a/1030349/210020

Внутри реестра это массив, ключами которого являются имена менеджеров, а значениями - объекты менеджеров. Это, собственно, и есть сопоставление

PS: $entityManager = $this->getDoctrine()->getManager('default'); - лучше не делать правильнее

$entityManager = $this->getDoctrine()->getManager();

PPS: И работать с доктринячьими потрохами лучше не в контроллерах, а в сервисах

Answer 2

как нет? а здесь: /vendor/doctrine/persistence/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php

    /**
     * {@inheritdoc}
     *
     * @throws InvalidArgumentException
     */
    public function getManager($name = null)
    {
        if ($name === null) {
            $name = $this->defaultManager;
        }
        if (! isset($this->managers[$name])) {
            throw new InvalidArgumentException(sprintf('Doctrine %s Manager named "%s" does not exist.', $this->name, $name));
        }
        return $this->getService($this->managers[$name]);
    }

или я что-то не правильно понял?

READ ALSO
Нужно после символа убрать остальные знаки

Нужно после символа убрать остальные знаки

есть вводимое число ll+lll; нужно чтобы после + все числа удалены были, как это сделать, числа могут быть не только ll+lll, могуть быть l+ll,lv+vl и тпСуть...

174
LDAP + Spring: как авторизоваться правильно?

LDAP + Spring: как авторизоваться правильно?

В Spring есть реализация авторизация по LDAPВ нашем конкретном случае, это происходит через ActiveDirectoryLdapAuthenticationProvider

97
Как переконфигурить OAuth2Config

Как переконфигурить OAuth2Config

Есть конфигурация

171
Не получается использовать table

Не получается использовать table

Есть база данных sql, в ней есть две таблицы, при вводе команды use user, выводится фраза Database changedОднако при выполнении такой же последовательности...

95