Php 如何检查类是否为条令实体?

Php 如何检查类是否为条令实体?,php,doctrine-orm,Php,Doctrine Orm,给定一个类名,比如Domain\Model\User,是否有一种编程方法可以知道该类是否标记为条令实体 我可以检查是否存在@实体注释,但我正在寻找一种通用方法,可以与任何元数据驱动程序(注释、YAML、XML等)一起使用。一个解决方法是测试是否可以生成存储库。这是“防弹”的,因为如果当前模式和映射不知道所讨论的对象类,它将失败 // Get the entity manager. I don't know how you do it $em = new Doctrine\ORM\EntityMa

给定一个类名,比如
Domain\Model\User
,是否有一种编程方法可以知道该类是否标记为条令实体


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

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

// Get the entity manager. I don't know how you do it
$em = new Doctrine\ORM\EntityManager();

try {
    $repo = $em->getRepository('YourClassModel');
} catch (Doctrine\Common\Persistence\Mapping\MappingException $e) {
    // NOPE! Not a mapped model
}
礼节:

返回$em->getMetadataFactory()->isTransient($className);
我要补充的是,该方法将代理(EntityManager作为延迟加载策略的一部分返回)视为瞬态;因此,如果您在测试对象,不要盲目使用
get_class()
,请确保首先测试:

$object instanceof\doctor\Common\Persistence\Proxy
工作执行:

使用条令\Common\Persistence\Proxy;
使用条令\ORM\EntityManager;
/**
*@param EntityManager$em
*@param string | object$class
*
*@returnbool
*/
函数isEntity(EntityManager$em,$class):bool
{
if(is_对象($class)){
$class=(代理的$class实例)
?获取家长课程($class)
:get_class($class);
}
return!$em->getMetadataFactory()->isTransient($class);
}

作为本杰明答案的补充…
如果您确实知道您正在处理条令实体,但不确定您是否拥有真实类的代理或实例,则可以通过使用条令公共
ClassUtils
,轻松检索真实类:

use Doctrine\Common\Util\ClassUtils;
然后您可以通过静态
getClass
方法获得真实的类,如下所示:

$proxyOrEntity;

$className = ClassUtils::getClass($proxyOrEntity);
/**
 * @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);
}
这意味着@Benjamin his
isEntity
函数可以这样编写:

$proxyOrEntity;

$className = ClassUtils::getClass($proxyOrEntity);
/**
 * @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);
}

这将根据类是否为条令实体给出正确/错误。

Benjamin,你的意思是内存中的模型是否由条令生成?@Rottingham否,我的意思是给定的类名是否被条令识别为实体,给出了映射信息。我在
$em->getClassMetadata
中遇到了一个类似的方法,并捕获了
MappingException
,但我很好奇是否有一种更优雅的方法。。。让我们拭目以待吧!请注意:
ClassUtils
自Common 2.9起已被折旧。该折旧未被预先确定: