Search code examples
phpdoctrine-orm

How to check if a class is a Doctrine entity?


Given a class name, say Domain\Model\User, is there a programmatic way to know whether this class is marked as a Doctrine entity?

I could check for the presence of the @Entity annotation, but I'm looking for a generic way that would work with any metadata driver (annotations, YAML, XML, etc.)


Solution

  • Courtesy Stof on the doctrine-dev mailing list:

    return ! $em->getMetadataFactory()->isTransient($className);
    

    I'll add that this method considers proxies (returned by the EntityManager as part of the lazy loading strategy) as transient; so if you're testing objects, don't blindly use get_class(), be sure to test first:

    $object instanceof \Doctrine\Common\Persistence\Proxy
    

    Working implementation:

    use Doctrine\Common\Persistence\Proxy;
    use Doctrine\ORM\EntityManager;
    
    function isEntity(EntityManager $em, string|object $class): bool
    {
        if (is_object($class)) {
            $class = ($class instanceof Proxy)
                ? get_parent_class($class)
                : get_class($class);
        }
    
        return ! $em->getMetadataFactory()->isTransient($class);
    }