Implementing Wakeup or Clone

Section author: Roman Borschel (roman@code-factory.org)

As explained in the restrictions for entity classes in the manual, 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.

Fork me on GitHub