Permalink
Find file
Fetching contributors…
Cannot retrieve contributors at this time
79 lines (59 sloc) 2.21 KB

Implementing Wakeup or Clone

.. sectionauthor:: 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.