给定一个类名,比如说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
}