【问题标题】:Detect if an object is an entity (without interfaces)检测对象是否为实体(无接口)
【发布时间】:2014-02-21 10:14:27
【问题描述】:

例如我有这个实体。

<?php

namespace AcmeDemo\UserBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Test
 *
 * @ORM\Table(name="test")
 * @ORM\Entity
 */
class Test implements IEntity
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }
}

这就是界面。

<?php

namespace AcmeDemo\UserBundle\Entity;

interface IEntity
{
    public function getId();
}

然后我可以通过检查对象

$object = new Test();
if ($object instanceof IEntity) {
    echo 'Yes, its an entity.';
} else {
    echo 'No entity detected!';
}

但如果我没有声明接口,我就不能这样做。 并且在每个实体上定义 IEntity 也是不好的。

我能做什么来代替上面的例子?

在此先感谢您! :)

【问题讨论】:

标签: symfony doctrine-orm doctrine entity symfony-2.3


【解决方案1】:

您可以使用教义注释阅读器并在类上搜索“实体”注释。

<?php
use Doctrine\Common\Annotations\AnnotationReader;

$annotationReader = new AnnotationReader();

//Get class annotation
$reflectionClass = new ReflectionClass('My\Class');
$classAnnotations = $annotationReader->getClassAnnotations($reflectionClass);

【讨论】:

    【解决方案2】:

    我不知道你为什么要检测一个对象是否是一个实体,但假设你正在使用 Doctrine,你可以使用以下内容:

    $em-&gt;getMetadataFactory()-&gt;hasMetadataFor('AcmeDemo\UserBundle\Entity\Test')

    hasMetadataFor 仅检查 Doctrine 元数据。如果你想确定它是一个实体,你可以计算它:

    $meta = $em->getMetadataFactory()->getMetadataFor('AcmeDemo\UserBundle\Entity\Test');
    $em->getMetadataFactory()->isEntity($meta);
    

    【讨论】:

    • isEntity() 是受保护的方法
    猜你喜欢
    • 2010-10-20
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    相关资源
    最近更新 更多