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 从超类确定和访问子类的主要内容,如果未能解决你的问题,请参考以下文章