2015-11-15 104 views
1

我正在做一個symfony應用程序。我嘗試實現一個用戶系統。使用不同的實體登錄symfony

3類型的人可以登錄:學生,教師和祕書

enter image description here

如果我modelise這樣,我該怎麼做一個登錄類?

在我的學生我的實體有:

/** 
* @var \essaiBundle\Entity\User 
* 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="NONE") 
* @ORM\OneToOne(targetEntity="essaiBundle\Entity\User") 
* @ORM\JoinColumns({ 
* @ORM\JoinColumn(name="id", referencedColumnName="id") 
* }) 
*/ 
private $id; 

,提及的用戶ID。

如何獲取用戶登錄的角色?

我的安全文件:

security: 
    providers: 
     our_db_provider: 
      entity: { class: essaiBundle\Entity\User, property: username} 

    access_control: 
     - { path: ^/admin, roles: ROLE_ADMIN } 
    firewalls: 
     login_firewall: 
      pattern: ^/login$ 
      anonymous: ~ 
     default: 
      anonymous: ~ 
      http_basic: ~ 
      form_login: 
       login_path: /login 
       check_path: /login_check 
       csrf_provider: security.csrf.token_manager 
       default_target_path: admin 
      provider: our_db_provider 


    encoders: 
     essaiBundle\Entity\User: 
      algorithm: bcrypt 
      cost: 12 

感謝

+1

'Student','Teacher'和'Secretary'實體有什麼區別?在這種情況下,[角色機制](http://symfony.com/doc/current/book/security.html#roles)是否不夠?如果你不得不分開你的實體,請看[Doctrine inheritance](https://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html)。 – chapay

+0

由於應用程序的其他部分,我需要3個實體。教師與學生等的屬性不一樣,而且與其他實體的關係也不同。 – anubis

+0

當您使用多個用戶提供者時,您可以使用多個用戶實體:http://symfony.com/doc/currentbook/security/multiple_user_providers.html 但是,您應該考慮只使用一個用戶實體和多個角色chapay建議。 –

回答

2

的問題是在應用架構。 我認爲你開始從數據庫端設計應用程序。您需要將方法更改爲應用程序設計。教義可以在基地處理自己,你不必再擔心基地。

這是你的新class diagram

你並不需要一到一個關係(與用戶和學生爲例)。學生,老師,祕書從用戶處擴展而來。這使您可以簡化工作日誌記錄,因爲你必須配置用戶類只

用戶實體:

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\InheritanceType("JOINED") 
* @ORM\DiscriminatorColumn(name="discr", type="string") 
* @ORM\DiscriminatorMap({"user" = "User", "student" = "Student", "teacher" = "Teacher", "secretary" = "Secretary"}) 
*/ 
class User 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * Name 
    * 
    * @var string 
    * @ORM\Column(name="name", type="string", length=255) 
    */ 
    private $name; 

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

    /** 
    * @return string 
    */ 
    public function getName() 
    { 
     return $this->name; 
    } 

    /** 
    * @param string $name 
    */ 
    public function setName($name) 
    { 
     $this->name = $name; 
    } 
} 

學生實體:

use Doctrine\ORM\Mapping as ORM; 

/** 
* Student 
* 
* @ORM\Table() 
* @ORM\Entity 
*/ 
class Student extends User 
{ 
    private $teachers; // extra field for student 
} 

教師的班級:

use Doctrine\ORM\Mapping as ORM; 

/** 
* Teacher 
* 
* @ORM\Table() 
* @ORM\Entity 
*/ 
class Teacher extends User 
{ 
    private $students; // extra field for teacher 
} 

祕書實體:

use Doctrine\ORM\Mapping as ORM; 

/** 
* Secretary 
* 
* @ORM\Table() 
* @ORM\Entity 
*/ 
class Secretary extends User 
{ 
    private $sercretaryBar; // extra field for secretary 
} 

這裏是鏈接Doctrine doc,這將幫助你。

DB:

當你改變你的實體,您可以檢查什麼樣的變化,你需要在數據庫應用:

app/console doctrine:schema:update --dump-sql 

強行改變DB:

app/console doctrine:schema:update --force 

我建議使用migrations(packagist.org上的doctrine/doctrine-migrations-bundle),如果你不使用到目前爲止。

+0

你完全正確。我之前完成了數據庫模型。我認爲你的解決方案必須是一個很好的解決方案,但登錄類還必須擴展用戶類?我如何訪問直接從security.yml文件擴展用戶類的登錄名? – anubis

+0

你不需要登錄類。所有登錄過程都使用User類。請參考[symfony doc](http://symfony.com/doc/current/cookbook/security/entity_provider.html) – ailushyk

+0

好的,問題是在一個數據庫中,一個屬性不能爲空(它可以但它不是好)。因爲在我的應用程序中,用戶不能有登錄名和密碼(他無法登錄),那麼我使用另一個實體提供此信息。 但是好的,如果我使用普通解決方案,並且將用戶名和密碼放在用戶類的屬性中。那麼我怎麼能知道用戶是否具有學生角色,祕書角色或教師角色? – anubis