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.)
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);
}