Doctrine PHP Best practices
Persist entity only when you need to
Beginner
Rule
You have to persist an entity when you want it to be managed by Doctrine. But please don't
persist entities that are already managed by Doctrine.
Explanation
What you should NOT do:
<?php
$article = $entityManager->find('CMS\Article', 1234);
$article->setHeadline('Hello World dude!');
$entityManager->persist($article);
$entityManager->flush();
When you get an entity from the database, it's already managed by Doctrine. You don't have to persist it again. It will not create any errors or bugs but you will add useless code in your project.
Only persist new entity:
<?php
$user = new User;
$user->setName('Mr.Right');
$em->persist($user);
$em->flush();
Naming strategy
Beginner
Rule
Naming strategy can provide rules for automatically generating database identifiers,
columns and tables names when the table/column name is not given. This feature helps reduce the verbosity of the mapping document, eliminating repetitive noise
Explanation
What you should NOT do:
/**
* @Entity
* @Table(name="users")
*
*/
class User
{
/**
* @Id @GeneratedValue @Column(name="id", type="integer")
*/
private $id = null;
/**
* @Column(name="login", type="string")
*/
public $login;
/**
* @Column(name="password", type="string")
*/
public $password = null;
}
See in all the annotation we have a name property. Every developper use different naming conventions for columns and tables names.
So your code should look like this:
/**
* @Entity
* @Table
*
*/
class User
{
/**
* @Id @GeneratedValue @Column(type="integer")
*/
private $id = null;
/**
* @Column(type="string")
*/
public $login;
/**
* @Column(type="string")
*/
public $password = null;
With the above code, the developper will not have to take care about the name of columns and tables names, so they will be more efficient and will not have to care about creepy things.
Note: Doctrine provides different naming strategies and let you the possibility to implements
your own ones, see Doctrine Naming strategies
Found a typo? Something is wrong in this documentation? Just fork and edit it!