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); }
As an addition to Benjamin his answer...
If you know for sure that you are handling doctrine entities, but you are not sure whether you have a proxy or a instance of the real class you can easily retrieve the real class by using the Doctrine Common ClassUtils
:
use Doctrine\Common\Util\ClassUtils;
and then you can get the real class through the static getClass
method like this:
$proxyOrEntity; $className = ClassUtils::getClass($proxyOrEntity);
So this means @Benjamin his isEntity
function can be written like this:
/** * @param EntityManager $em * @param string|object $class * * @return boolean */ function isEntity(EntityManager $em, $class) { if(is_object($class)){ $class = ClassUtils::getClass($class); } return ! $em->getMetadataFactory()->isTransient($class); }
Which will give you true/false depending on whether the class is a doctrine entity or not.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With