Best Practices

Here are some best practices you can follow when working with the Doctrine MongoDB ODM.

Constrain relationships as much as possible

It is important to constrain relationships as much as possible. This means:

  • Impose a traversal direction (avoid bidirectional associations if possible)
  • Eliminate nonessential associations

This has several benefits:

  • Reduced coupling in your domain model
  • Simpler code in your domain model (no need to maintain bidirectionality properly)
  • Less work for Doctrine

Use events judiciously

The event system of Doctrine is great and fast. Even though making heavy use of events, especially lifecycle events, can have a negative impact on the performance of your application. Thus you should use events judiciously.

Use cascades judiciously

Automatic cascades of the persist/remove/merge/etc. operations are very handy but should be used wisely. Do NOT simply add all cascades to all associations. Think about which cascades actually do make sense for you for a particular association, given the scenarios it is most likely used in.

Don't use special characters

Avoid using any non-ASCII characters in class, field, table or column names. Doctrine itself is not unicode-safe in many places and will not be until PHP itself is fully unicode-aware.

Initialize collections in the constructor

It is recommended best practice to initialize any business collections in documents in the constructor.

Example:

1<?php namespace MyProject\Model; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; class User { private Collection $addresses; private Collection $articles; public function __construct() { $this->addresses = new ArrayCollection(); $this->articles = new ArrayCollection(); } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

The properties' type hints must be Collection, and cannot be ArrayCollection. When the User object is retrieved from the database, the properties $addresses and $articles are instances of Doctrine\ODM\MongoDB\PersistentCollection to track changes.