1
0
mirror of synced 2024-12-17 00:18:42 +03:00
doctrine2/cookbook/en/implementing-wakeup-or-clone.txt

64 lines
2.0 KiB
Plaintext
Raw Normal View History

2010-04-06 22:36:40 +04:00
As explained in the [restrictions for entity classes in the manual](http://www.doctrine-project.org/documentation/manual/2_0/en/architecture#entities),
it is usually not allowed for an entity to implement `__wakeup` or `__clone`, because Doctrine
makes special use of them. However, it is quite easy to make use of these methods in a safe way
by guarding the custom wakeup or clone code with an entity identity check, as demonstrated in the following sections.
++ Safely implementing __wakeup
To safely implement `__wakeup`, simply enclose your implementation code in an identity check
as follows:
[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!
}
//...
}
++ Safely implementing __clone
Safely implementing `__clone` is pretty much the same:
[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!
}
//...
}
++ 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.