2016-11-23 5 views
-2

다 대 다 관계가있는 두 객체를 사용하여 심포니 3 폼을 구현하는 데 문제가 있습니다.심포니 3 폼 내 다 대다 관계

"사용자"와 "역할"이라는 두 개의 데이터 테이블이 있습니다. 나는 사용자를 편집하고 사용자에게 몇 가지 역할을 할당 할 수있는 양식이 필요합니다. 자세하게는 각 역할이 확인란 인 양식을 원하며 사용자가 어떤 역할을 수행할지 선택할 수 있습니다. 새로운 UserType을 구현해야하지만 어떻게 동적 체크 박스를 구현할 수 있습니까?

이 내 사용자 클래스입니다 :

<?php 

// src/AppBundle/Entity/User.php 
namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Security\Core\User\UserInterface; 

/** 
* @ORM\Table(name="app_users") 
* @ORM\Entity(repositoryClass="AppBundle\Entity\UserRepository") 
*/ 
class User implements UserInterface, \Serializable 
{ 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\Column(type="string", length=25, unique=true) 
    */ 
    private $username; 

    /** 
    * @ORM\Column(type="string", length=64) 
    */ 
    private $password; 

    /** 
    * @ORM\Column(type="string", length=60, unique=true) 
    */ 
    private $email; 

    /** 
    * @ORM\Column(name="is_active", type="boolean") 
    */ 
    private $isActive; 

    /** 
    * @ORM\ManyToMany(targetEntity="Role", inversedBy="users") 
    * @ORM\JoinTable(name="user_roles") 
    */ 
    private $roles; 

    public function __construct() 
    { 
     $this->isActive = true; 
     // may not be needed, see section on salt below 
     // $this->salt = md5(uniqid(null, true)); 
    } 

    public function getUsername() 
    { 
     return $this->username; 
    } 

    public function getSalt() 
    { 
     // you *may* need a real salt depending on your encoder 
     // see section on salt below 
     return null; 
    } 

    public function getPassword() 
    { 
     return $this->password; 
    } 

    public function getRoles() 
    { 
     $permissionsArray = array(); 
     foreach ($this->roles as $role) 
     { 
      $rolesPermissions = $role->getPermissions(); 
      for($i=0;$i<count($rolesPermissions);$i++) 
       if(!in_array($rolesPermissions[$i],$permissionsArray)) 
        $permissionsArray[] = $rolesPermissions[$i]; 
     } 
     return $permissionsArray; 
    } 

    public function eraseCredentials() 
    { 
    } 

    /** @see \Serializable::serialize() */ 
    public function serialize() 
    { 
     return serialize(array(
      $this->id, 
      $this->username, 
      $this->password, 
      // see section on salt below 
      // $this->salt, 
     )); 
    } 

    /** @see \Serializable::unserialize() */ 
    public function unserialize($serialized) 
    { 
     list (
     $this->id, 
     $this->username, 
     $this->password, 
     // see section on salt below 
     // $this->salt 
     ) = unserialize($serialized); 
    } 

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

    /** 
    * Set username 
    * 
    * @param string $username 
    * 
    * @return User 
    */ 
    public function setUsername($username) 
    { 
     $this->username = $username; 

     return $this; 
    } 

    /** 
    * Set password 
    * 
    * @param string $password 
    * 
    * @return User 
    */ 
    public function setPassword($password) 
    { 
     $this->password = $password; 

     return $this; 
    } 

    /** 
    * Set email 
    * 
    * @param string $email 
    * 
    * @return User 
    */ 
    public function setEmail($email) 
    { 
     $this->email = $email; 

     return $this; 
    } 

    /** 
    * Get email 
    * 
    * @return string 
    */ 
    public function getEmail() 
    { 
     return $this->email; 
    } 

    /** 
    * Set isActive 
    * 
    * @param boolean $isActive 
    * 
    * @return User 
    */ 
    public function setIsActive($isActive) 
    { 
     $this->isActive = $isActive; 

     return $this; 
    } 

    /** 
    * Get isActive 
    * 
    * @return boolean 
    */ 
    public function getIsActive() 
    { 
     return $this->isActive; 
    } 
} 

그리고 이것은 내 역할 클래스입니다 :

<?php 

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* Role 
* 
* @ORM\Table(name="role") 
* @ORM\Entity(repositoryClass="AppBundle\Repository\RoleRepository") 
*/ 
class Role 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

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

    /** 
    * @ORM\ManyToMany(targetEntity="User", mappedBy="roles") 
    */ 
    private $users; 

    /** 
    * @ORM\ManyToMany(targetEntity="Permission", inversedBy="roles") 
    * @ORM\JoinTable(name="roles_permissions") 
    */ 
    private $permissions; 

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

    /** 
    * Set bezeichnung 
    * 
    * @param string $description 
    * 
    * @return Role 
    */ 
    public function setBezeichnung($bezeichnung) 
    { 
     $this->bezeichnung = $bezeichnung; 

     return $this; 
    } 

    /** 
    * Get bezeichnung 
    * 
    * @return string 
    */ 
    public function getBezeichnung() 
    { 
     return $this->bezeichnung; 
    } 
    /** 
    * Constructor 
    */ 
    public function __construct() 
    { 
     $this->users = new \Doctrine\Common\Collections\ArrayCollection(); 
     $this->roles = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 

    /** 
    * Add user 
    * 
    * @param \AppBundle\Entity\User $user 
    * 
    * @return Role 
    */ 
    public function addUser(\AppBundle\Entity\User $user) 
    { 
     $this->users[] = $user; 

     return $this; 
    } 

    /** 
    * Remove user 
    * 
    * @param \AppBundle\Entity\User $user 
    */ 
    public function removeUser(\AppBundle\Entity\User $user) 
    { 
     $this->users->removeElement($user); 
    } 

    /** 
    * Get users 
    * 
    * @return \Doctrine\Common\Collections\Collection 
    */ 
    public function getUsers() 
    { 
     return $this->users; 
    } 


    /** 
    * Add permission 
    * 
    * @param \AppBundle\Entity\Permission $permission 
    * 
    * @return Role 
    */ 
    public function addPermission(\AppBundle\Entity\Permission $permission) 
    { 
     $this->permissions[] = $permission; 

     return $this; 
    } 

    /** 
    * Remove permission 
    * 
    * @param \AppBundle\Entity\Permission $permission 
    */ 
    public function removePermission(\AppBundle\Entity\Permission $permission) 
    { 
     $this->permissions->removeElement($permission); 
    } 

    /** 
    * Get permissions 
    * 
    * @return Array 
    */ 
    public function getPermissions() 
    { 
     $permissionsArray = array(); 
     foreach ($this->permissions as $permission) 
      $permissionsArray[] = "ROLE_".$permission->getTechBezeichnung(); 
     return $permissionsArray; 
    } 
} 

답변

0

a)받은 기관 __toString() 방법을 지정합니다.

b) UserType을 만듭니다. CLI 명령 bin/console doctrine:generate:crud을 사용하고 "쓰기 작업"[예]을 선택할 수도 있습니다. 스크립트는 컨트롤러, formType 및 일부 템플릿을 생성합니다.

C) UserType을 상단에이 사용하는 문을 추가 :

use Symfony\Bridge\Doctrine\Form\Type\EntityType; 

D) 유저 유형에이 양식 필드를 추가

->add('roles', EntityType::class, array(
    'expanded => true, 
    'multiple' => true 
)) 
+0

안녕하세요, 나는 이것이 잘 작동 생각합니다. 그러나 이제 getRoles와 getPermissions가 수정되었으므로 (경고 : 잘못된 인수가 foreach()에 제공됨) (필자는 자동 화를 위해 모든 문자열을 가져와야 함). 이 문제를 어떻게 해결할 수 있는지 알고 있습니까? isGranted ("ROLE _...")로 나뭇 가지 템플릿을 체크인 할 역할이 필요하므로 getRoles 및 getPermissions가 문자열 배열을 반환해야합니다. 이 문제를 처리 할 수있는 방법이 있습니까? – user3296316

+0

배열을 전달하지 않는 foreach() sa에 대해 잘못된 인수가 제공되었습니다. 대신 값이 null 일 수 있습니까? –