Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 225
JeanValjean Avatar asked Dec 15 '22 20:12

JeanValjean


2 Answers

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.

like image 74
Ondrej Slinták Avatar answered Feb 01 '23 03:02

Ondrej Slinták


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.

like image 35
Boris Kotov Avatar answered Feb 01 '23 05:02

Boris Kotov