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



给定一个类名,比如说DomainModelUser,有没有一种编程方法可以知道这个类是否被标记为教义实体?

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

由 doctrine-dev 邮件列表上的 Stof 提供:

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

我要补充一点,此方法将代理(由 EntityManager 作为延迟加载策略的一部分返回)视为瞬态;因此,如果您要测试对象,请不要盲目使用 get_class() ,请务必先进行测试:

$object instanceof DoctrineCommonPersistenceProxy

工作实施:

use DoctrineCommonPersistenceProxy;
use DoctrineORMEntityManager;
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);
}

作为本杰明的补充,他的回答...
如果您确定您正在处理教义实体,但您不确定您是否有真实类的代理或实例,则可以使用教义通用ClassUtils轻松检索真实类:

use DoctrineCommonUtilClassUtils;

然后你可以通过静态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);
}

这将根据该类是否是教义实体来判断真/假。

一种解决方法是测试是否可以生成存储库。这是"防弹",因为如果当前模式和映射不知道所讨论的对象类,它将失败。

// Get the entity manager. I don't know how you do it
$em = new DoctrineORMEntityManager();
try {
    $repo = $em->getRepository('YourClassModel');
} catch (DoctrineCommonPersistenceMappingMappingException $e) {
    // NOPE! Not a mapped model
}

相关内容

  • 没有找到相关文章

最新更新