Symfony2 从超类确定和访问子类

Posted

技术标签:

【中文标题】Symfony2 从超类确定和访问子类【英文标题】:Symfony2 determine and access subclass from superclass 【发布时间】:2013-10-30 12:40:58 【问题描述】:

我有 3 种“用户”可以登录我的网站:

    员工 住房供应商 购房者

我让这些类中的每一个都扩展了 User Master 类,它实现了 Symfony2 AdvancedUserInterface

/**                                                                                                                                          
 * @ORM\Entity                                                                                                                               
 * @ORM\Table(name="acme_users")                                                                                                      
 * @ORM\InheritanceType("JOINED")                                                                                                            
 * @ORM\DiscriminatorColumn(name="discr", type="string")                                                                                     
 * @ORM\DiscriminatorMap("provider" = "ProviderUser", "seeker" = "SeekerUser", "staff" =  "StaffUser")                     
 */
class User extends AdvancedUserInterface, \Serializable

    //---


/**                                                                                                                                          
 * @ORM\Entity                                                                                                                               
 * @ORM\Table(name="acme_seeker_users")                                                                                                      
 */
class SeekerUser extends User

    //---


/**                                                                                                                                          
 * @ORM\Entity                                                                                                                               
 * @ORM\Table(name="acme_provider_users")                                                                                                      
 */
class ProviderUser extends User

    //---


/**                                                                                                                                          
 * @ORM\Entity                                                                                                                               
 * @ORM\Table(name="acme_staff_users")                                                                                                      
 */
class StaffUser extends User

    //---

每种类型的用户都有不同的属性,同时继承了主用户类的一些共同属性。

我的问题是,如何确定和访问主用户类的子类?

所以,我说我在控制器中得到这样的用户用户:

// get logged in user
$user = $this->get('security.context')->getToken()->getUser();

// get any user by $id
$user = $this->getDoctrine()->getRepository('acmeUserBundle:User')->findOneById($id);

然后我如何确定它是哪个用户并随后访问该类型用户的特定属性?

还是说我做错了?

【问题讨论】:

【参考方案1】:

一个简单的get_class($user) 就可以解决问题。它将为您提供给定类的名称。或$user instanceof ProviderUser(或任何其他鉴别器)。

Doctrine 将返回您在鉴别器映射中定义的类型的实体。

【讨论】:

+1 没错,但尽量避免使用 get_class,instanceof 是要走的路。 哇,这么简单。教义确实可以很好地处理繁重的工作!谢谢@Rene!

以上是关于Symfony2 从超类确定和访问子类的主要内容,如果未能解决你的问题,请参考以下文章

当子类使用Object变量实例化时,无法从超类访问方法

从超类调用子类方法

从超类调用子类的方法

子类是不是从超类继承私有实例变量

从超类列表中提取给定子类的元素

从超类中获取子类的名称