比如说Domain\Model\User,给定一个类名是否有一种编程方式来了解这个类是否被标记为一个Doctrine实体?
我可以检查是否存在@Entity注释,但我正在寻找一种适用于任何元数据驱动程序的通用方法(注释,YAML,XML等)
Ben*_*min 23
return ! $em->getMetadataFactory()->isTransient($className);
Run Code Online (Sandbox Code Playgroud)
我将补充说,此方法将代理(由EntityManager作为延迟加载策略的一部分返回)视为瞬态; 因此,如果您正在测试物体,请不要盲目使用get_class(),请务必先测试:
$object instanceof \Doctrine\Common\Persistence\Proxy
Run Code Online (Sandbox Code Playgroud)
工作实施:
use Doctrine\Common\Persistence\Proxy;
use Doctrine\ORM\EntityManager;
/**
* @param EntityManager $em
* @param string|object $class
*
* @return boolean
*/
function isEntity(EntityManager $em, $class)
{
if (is_object($class)) {
$class = ($class instanceof Proxy)
? get_parent_class($class)
: get_class($class);
}
return ! $em->getMetadataFactory()->isTransient($class);
}
Run Code Online (Sandbox Code Playgroud)
作为本杰明的补充,他的回答是......
如果你确定你正在处理教义实体,但是你不确定你是否有一个代理或真实类的实例,你可以通过使用教义轻松地检索真正的类.常见ClassUtils:
use Doctrine\Common\Util\ClassUtils;
Run Code Online (Sandbox Code Playgroud)
然后你可以通过静态getClass方法得到真正的类,如下所示:
$proxyOrEntity;
$className = ClassUtils::getClass($proxyOrEntity);
Run Code Online (Sandbox Code Playgroud)
所以这意味着@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);
}
Run Code Online (Sandbox Code Playgroud)
根据该类是否是一个学说实体,哪个会给你真/假.
一个解决方法是测试是否可以生成存储库.这是"防弹",因为如果当前架构和映射不知道有关的对象类,它将失败.
// 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
}
Run Code Online (Sandbox Code Playgroud)