如何检查一个类是否是一个Doctrine实体?

Ben*_*min 15 php doctrine-orm

比如说Domain\Model\User,给定一个类名是否有一种编程方式来了解这个类是否被标记为一个Doctrine实体?

我可以检查是否存在@Entity注释,但我正在寻找一种适用于任何元数据驱动程序的通用方法(注释,YAML,XML等)

Ben*_*min 23

在doctrine-dev邮件列表上提供Stof:

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)


Wil*_*ilt 9

作为本杰明的补充,他的回答是......
如果你确定你正在处理教义实体,但是你不确定你是否有一个代理或真实类的实例,你可以通过使用教义轻松地检索真正的类.常见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)

根据该类是否是一个学说实体,哪个会给你真/假.

  • 请注意:`ClassUtils` 已从 Doctrine Common 2.9 开始贬值。 (4认同)
  • 它已被弃用:https://github.com/doctrine/common/commit/f811639f788d3ce0bd152a983ac76a0aba42ff77 (2认同)

Rot*_*ham 6

一个解决方法是测试是否可以生成存储库.这是"防弹",因为如果当前架构和映射不知道有关的对象类,它将失败.

// 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)