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 hisisEntity
函数可以这样编写:
$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起已被折旧。该折旧未被预先确定: