如何使用 fos user bundle 实现多用户支持
How to implement multi user support using fos user bundle
我一直在使用带有 fos 用户包的 symfony 3.4 框架开发一个多用户 Web 应用程序,以便轻松地操纵用户。
我已经集成了捆绑包并且一切正常,除了捆绑包功能在通过继承涉及多用户时不符合我的需要!
在 fos bundle 中实现多用户继承有什么技巧吗?
我尝试了很多不同的技巧,例如更改角色、更改用户模型界面、使用 symfony 组,但所有这些技巧似乎都不起作用!
[以丑陋的方式] 解决我的问题的方法是更改鉴别器列的值。
* @ORM\Table(name="fos_user")
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name="typeutilisateur", type="string")
* @ORM\DiscriminatorMap({"Parent"="User","admin" =
"Administrateur","association"
="AsoociationsBundle\Entity\Association",
"Demandeurservice"="EldersStoryBundle\Entity\Demandeurservice",
"Formateur"="FormationBundle\Entity\Formateur"
,"Prestataire"="AnnonceEldersCareBundle\Entity\Prestataireservice"})
class User extends BaseUser
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var string
*
* @ORM\Column(name="nom", type="string", length=30, nullable=true)
*/
private $nom;
/**
* @var string
*
* @ORM\Column(name="prenom", type="string", length=30, nullable=true)
*/
private $prenom;
/**
* @var string
*
* @ORM\Column(name="adresse", type="string", length=50)
*/
private $adresse;
/**
* @var string
*
* @ORM\Column(name="telephone", type="integer")
*/
private $telephone;
/**
* @var string
*
* @ORM\Column(name="sexe", type="string", length=30, nullable=true)
*/
private $sexe;
/**
* @var \DateTime
*
* @ORM\Column(name="datecreation", type="datetime")
*/
private $datecreation;
/**
* @var string
*
* @ORM\Column(name="avatar", type="string", length=255)
*/
private $avatar;
/**
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Group")
* @ORM\JoinTable(name="fos_user_user_group",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")}
* )
*/
protected $groups;
public function __construct()
{
parent::__construct();
}
}
/*This is the sub class*/
<?php
namespace EldersStoryBundle\Entity;
use AppBundle\Entity\User;
use Doctrine\ORM\Mapping as ORM;
/**
* Demandeurservice
*
* @ORM\Table(name="demandeurservice")
* @ORM\Entity(repositoryClass="EldersStoryBundle\
Repository\DemandeurserviceRepository")
*/
class Demandeurservice extends User
{
/**
* @var string
*
* @ORM\Column(name="typemaladie", type="string", length=50)
*/
private $typemaladie;
/**
* @var string
*
* @ORM\Column(name="descriptionmaladie", type="string", length=255)
*/
private $descriptionmaladie;
/**
* @var string
*
* @ORM\Column(name="etatmaladie", type="string", length=255)
*/
private $etatmaladie;
/**
* @var int
*
* @ORM\Column(name="pointelderly", type="integer")
*/
private $pointelderly;
}
每次我订阅时,我都会得到 table 中的行,但有一个鉴别器列值 ="parent"
那么有什么主要的方法可以完成这项工作吗?或者至少改变鉴别器列的值?
删除 DiscriminatorMap
。如果你不创建一个,Doctrine 会自动生成一个。只要您不乱用 Entity 对象的名称(即将 Person
更改为 Persona
或其他),那么这是您最好的选择。它也更加动态,因为 if/when 你添加了额外的类型,它会为你更新它(当缓存被删除时)。
See here,引用的最后一个要点:
If no discriminator map is provided, then the map is generated automatically. The automatically generated discriminator map contains the lowercase short name of each class as key.
我一直在使用带有 fos 用户包的 symfony 3.4 框架开发一个多用户 Web 应用程序,以便轻松地操纵用户。 我已经集成了捆绑包并且一切正常,除了捆绑包功能在通过继承涉及多用户时不符合我的需要! 在 fos bundle 中实现多用户继承有什么技巧吗?
我尝试了很多不同的技巧,例如更改角色、更改用户模型界面、使用 symfony 组,但所有这些技巧似乎都不起作用! [以丑陋的方式] 解决我的问题的方法是更改鉴别器列的值。
* @ORM\Table(name="fos_user")
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name="typeutilisateur", type="string")
* @ORM\DiscriminatorMap({"Parent"="User","admin" =
"Administrateur","association"
="AsoociationsBundle\Entity\Association",
"Demandeurservice"="EldersStoryBundle\Entity\Demandeurservice",
"Formateur"="FormationBundle\Entity\Formateur"
,"Prestataire"="AnnonceEldersCareBundle\Entity\Prestataireservice"})
class User extends BaseUser
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var string
*
* @ORM\Column(name="nom", type="string", length=30, nullable=true)
*/
private $nom;
/**
* @var string
*
* @ORM\Column(name="prenom", type="string", length=30, nullable=true)
*/
private $prenom;
/**
* @var string
*
* @ORM\Column(name="adresse", type="string", length=50)
*/
private $adresse;
/**
* @var string
*
* @ORM\Column(name="telephone", type="integer")
*/
private $telephone;
/**
* @var string
*
* @ORM\Column(name="sexe", type="string", length=30, nullable=true)
*/
private $sexe;
/**
* @var \DateTime
*
* @ORM\Column(name="datecreation", type="datetime")
*/
private $datecreation;
/**
* @var string
*
* @ORM\Column(name="avatar", type="string", length=255)
*/
private $avatar;
/**
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Group")
* @ORM\JoinTable(name="fos_user_user_group",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")}
* )
*/
protected $groups;
public function __construct()
{
parent::__construct();
}
}
/*This is the sub class*/
<?php
namespace EldersStoryBundle\Entity;
use AppBundle\Entity\User;
use Doctrine\ORM\Mapping as ORM;
/**
* Demandeurservice
*
* @ORM\Table(name="demandeurservice")
* @ORM\Entity(repositoryClass="EldersStoryBundle\
Repository\DemandeurserviceRepository")
*/
class Demandeurservice extends User
{
/**
* @var string
*
* @ORM\Column(name="typemaladie", type="string", length=50)
*/
private $typemaladie;
/**
* @var string
*
* @ORM\Column(name="descriptionmaladie", type="string", length=255)
*/
private $descriptionmaladie;
/**
* @var string
*
* @ORM\Column(name="etatmaladie", type="string", length=255)
*/
private $etatmaladie;
/**
* @var int
*
* @ORM\Column(name="pointelderly", type="integer")
*/
private $pointelderly;
}
每次我订阅时,我都会得到 table 中的行,但有一个鉴别器列值 ="parent" 那么有什么主要的方法可以完成这项工作吗?或者至少改变鉴别器列的值?
删除 DiscriminatorMap
。如果你不创建一个,Doctrine 会自动生成一个。只要您不乱用 Entity 对象的名称(即将 Person
更改为 Persona
或其他),那么这是您最好的选择。它也更加动态,因为 if/when 你添加了额外的类型,它会为你更新它(当缓存被删除时)。
See here,引用的最后一个要点:
If no discriminator map is provided, then the map is generated automatically. The automatically generated discriminator map contains the lowercase short name of each class as key.