Coder Social home page Coder Social logo

[Bug]: Multiple entity managers per connection OR entity manager name does not match connection name about liiptestfixturesbundle HOT 5 OPEN

olifrieda avatar olifrieda commented on September 27, 2024 1
[Bug]: Multiple entity managers per connection OR entity manager name does not match connection name

from liiptestfixturesbundle.

Comments (5)

olifrieda avatar olifrieda commented on September 27, 2024

A dirty fix:

$this->connection = $this->om instanceof EntityManagerInterface ? $this->om->getConnection() : $this->registry->getConnection($omName);

The problem is, that the $this->registry->getManager($omName) does not return the EntityManagerInterface but the ObjectManager.

from liiptestfixturesbundle.

alexislefebvre avatar alexislefebvre commented on September 27, 2024

Thanks for the report!

Could you please open a PR with a fix? First we need to add a new Kernel with a new config that use more than entity manager, we only have one at the moment: https://github.com/liip/LiipTestFixturesBundle/blob/2.x/tests/AppConfigMysql/config.yml Then add tests that call the different entity managers.

Shoud we update the setObjectManagerName method like this?

-public function setObjectManagerName(string $omName = null): void
+public function setObjectManagerName(string $omName = null, ?string $connectionName = null): void
{
      $this->omName = $omName;
      $this->om = $this->registry->getManager($omName);
-     $this->connection = $this->registry->getConnection($omName);
+     $this->connection = $this->registry->getConnection($connectionName ?? $omName);
}

Then

static::getContainer()
    ->get(DatabaseToolCollection::class)
    ->get('a_name_not_matching_connection_name', 'default')
    ->loadFixtures([YourFixtures::class]);

may works.

from liiptestfixturesbundle.

olifrieda avatar olifrieda commented on September 27, 2024

@alexislefebvre It looks like, it is not that easy.

Loading fixtures like this:

static::getContainer()
            ->get(DatabaseToolCollection::class)
            ->get('client')
            ->loadFixtures([RunActionFixtures::class]);

the DatabaseToolCollection should handle the list of database tools. The index of this list depends on registry name and driver name. No dependency on connection or entity manager (no sure, if both is necessary). Each time, you pull out the database tool from the collection, the object manager (and connection) is set. This overwrites previous settings. This means, the last call of the get method will win.

See:

$databaseTool->setObjectManagerName($omName);

I have no quick fix for this. So I found a workaround. I changed the doctrine configuration for the test environment, so that the number of connections is equal to the number of entity managers and the entity managers names do now match the connection name. E. g. like this:

doctrine.yaml:

when@test:
    doctrine:
        dbal:
            connections:
                a_name_not_matching_connection_name:
                    url: '%env(resolve:DATABASE_TEST_URL)%'
        orm:
            entity_managers:
                a_name_not_matching_connection_name:
                    connection: a_name_not_matching_connection_name

If there is no one else out there having the same problem, it is ok, to handle this as an edge case without fixing it.

from liiptestfixturesbundle.

alexislefebvre avatar alexislefebvre commented on September 27, 2024

I tried to add a test with 2 connections and 2 entity managers and it added way more complexity than I expected: it means 2 different configurations for the entities, their schema and fixtures. I ended up with that classes that can't be found and I gave up.

I'm sorry but I can't help with this topic.

from liiptestfixturesbundle.

olifrieda avatar olifrieda commented on September 27, 2024

I also had a closer look, and - yes - it is more complex than it looked in the beginning. I do not have a really good idea right now, but I think, it is possible.

I think most projects do not have to deal with more than one connection or entity manager. If I found a good solution, I'll let you know. Thanks for your support.

from liiptestfixturesbundle.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.