I have the entity (such as below). I want to set some default values while creating.
As you can see in __construct
, it is easy to set the $name
(string), but how can I set the $group
? (for example I know that there is a group in database with id=122
)
/** * @ORMEntity */ class Person { private $id; /** @ORMColumn(type="string") */ private $name; /** * @ORMManyToOne(targetEntity="Group", inversedBy="persons") * @ORMJoinColumn(referencedColumnName="id") */ private $group; public function setGroup(Group $group) { $this->group = $group; $group->addPerson($this); } // ... setters/getters //construct default Person public function __construct() { $this->setName("Mike"); $this->setGroup($EXISTING_GROUP_FROM_MY_DB); // <<-------------- } }
Advertisement
Answer
I agree with moonwave99 that this is poor design. Here you are trying to access the database (through the Doctrine service) from a place that is not container-aware (i.e. it does not, and should not, know about Doctrine).
I had a similar issue recently… pretty much the same exact issue, actually. But I didn’t want this logic to be inside the controller. So I wrote a service to take care of the User creation. And I gave that service access to the only other service it needed: Doctrine.
Here’s an example, where a User is created with all available Roles:
namespace MyBundleEntity; class UserFactory { private $doctrine; public function __construct($doctrine) { $this->doctrine = $doctrine; } public function generateNewUser($email, $password) { $user = new User(); // Since you have access to the Doctrine service, you can use $this->doctrine // to do anything you would normally do in your controller with $this->getDoctrine() $roles = $this->doctrine->getEntityManager()->getRepository("MyBundle:Role")->findAll(); foreach ($roles as $role) { $user->addRole($role); } return $user; } }
Now register that service in config.yml
or services.yml
, remembering to pass the Doctrine service to it:
services: mybundle.factory.user: class: MyBundleEntityUserFactory arguments: ['@doctrine']
And that’s it… Now, in your controller, you can create a new User by doing:
public function MyController() { $user = $this->get("mybundle.factory.user")->generateNewUser("someone@email.com", "password123"); }