如何检查一个类是否是教义实体?
2022-08-30 18:59:56
给定一个类名,比如说,有没有一种编程方法来知道这个类是否被标记为一个教义实体?Domain\Model\User
我可以检查注释是否存在,但我正在寻找一种通用方法,可以与任何元数据驱动程序(注释,YAML,XML等)一起使用。@Entity
给定一个类名,比如说,有没有一种编程方法来知道这个类是否被标记为一个教义实体?Domain\Model\User
我可以检查注释是否存在,但我正在寻找一种通用方法,可以与任何元数据驱动程序(注释,YAML,XML等)一起使用。@Entity
由 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);
}
作为本杰明的补充,他的答案...
如果您确定您正在处理 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);
}
这将给你真/假,这取决于这个类是否是一个教义实体。