JeanValjean
JeanValjean

Reputation: 17713

Symfony2: get Doctrine in a generic PHP class

In a Symfony2 project, when you use a Controller, you can access Doctrine by calling getDoctrine() on this, i.e.:

$this->getDoctrine();

In this way, I can access the repository of such a Doctrine Entity.

Suppose to have a generic PHP class in a Symfony2 project. How can I retrieve Doctrine ? I suppose that there is such a service to get it, but I don't know which one.

Upvotes: 4

Views: 9343

Answers (2)

Boris Kotov
Boris Kotov

Reputation: 1782

After checking the symfony2 docs i figured out how to pass your service in a custom method to break the default behavior.

Rewrite your configs like this:

services:
my_mailer:
    class: Path/To/GenericClass
    calls:
         - [anotherMethodName, [doctrine.orm.entity_manager]]

So, the Service is now available in your other method.

public function anotherMethodName($entityManager)
{
    // your magic
}

The Answer from Ondrej is absolutely correct, I just wanted to add this piece of the puzzle to this thread.

Upvotes: 1

Ondrej Slinták
Ondrej Slinták

Reputation: 31910

You can register this class as a service and inject whatever other services into it. Suppose you have GenericClass.php as follows:

class GenericClass
{
    public function __construct()
    {
        // some cool stuff
    }
}

You can register it as service (in your bundle's Resources/config/service.yml|xml usually) and inject Doctrine's entity manager into it:

services:
    my_mailer:
        class: Path/To/GenericClass
        arguments: [doctrine.orm.entity_manager]

And it'll try to inject entity manager to (by default) constructor of GenericClass. So you just have to add argument for it:

public function __construct($entityManager)
{
     // do something awesome with entity manager
}

If you are not sure what services are available in your application's DI container, you can find out by using command line tool: php app/console container:debug and it'll list all available services along with their aliases and classes.

Upvotes: 11

Related Questions