You are browsing documentation for a version that has not yet been released.

Implementing Wakeup or Clone

Safely implementing \_\_wakeup

To safely implement __wakeup, simply enclose your implementation code in an identity check as follows:

1<?php class MyEntity { private $id; // This is the identifier of the entity. //... public function __wakeup() { // If the entity has an identity, proceed as normal. if ($this->id) { // ... Your code here as normal ... } // otherwise do nothing, do NOT throw an exception! } //... }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

Safely implementing \_\_clone

Safely implementing __clone is pretty much the same:

1<?php class MyEntity { private $id; // This is the identifier of the entity. //... public function __clone() { // If the entity has an identity, proceed as normal. if ($this->id) { // ... Your code here as normal ... } // otherwise do nothing, do NOT throw an exception! } //... }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

Summary

As you have seen, it is quite easy to safely make use of __wakeup and __clone in your entities without adding any really Doctrine-specific or Doctrine-dependant code.

These implementations are possible and safe because when Doctrine invokes these methods, the entities never have an identity (yet). Furthermore, it is possibly a good idea to check for the identity in your code anyway, since it's rarely the case that you want to unserialize or clone an entity with no identity.