如何检查一个类是否是教义实体?

2022-08-30 18:59:56

给定一个类名,比如说,有没有一种编程方法来知道这个类是否被标记为一个教义实体?Domain\Model\User

我可以检查注释是否存在,但我正在寻找一种通用方法,可以与任何元数据驱动程序(注释,YAML,XML等)一起使用。@Entity


答案 1

Doctrine-dev 邮件列表上的 Stof 提供

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

我要补充一点,此方法将代理(由 EntityManager 作为延迟加载策略的一部分返回)视为瞬态;所以如果你正在测试对象,不要盲目使用,一定要先测试:get_class()

$object instanceof \Doctrine\Common\Persistence\Proxy

工作实现:

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

答案 2

作为本杰明的补充,他的答案...
如果您确定您正在处理 doctrine 实体,但不确定您是代理还是 real 类的实例,则可以使用 Doctrine Common 轻松检索 real 类:ClassUtils

use Doctrine\Common\Util\ClassUtils;

然后你可以通过静态方法获得真正的类,如下所示:getClass

$proxyOrEntity;

$className = ClassUtils::getClass($proxyOrEntity);

所以这意味着@Benjamin他的函数可以这样写:isEntity

/**
 * @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);
}

这将给你真/假,这取决于这个类是否是一个教义实体。


推荐