Я очень новичок в Symfony2, и теперь у меня проблема с набором форм. У меня есть две Сущности. Пользователь Entity и роль Entity.
Пользователь
/**
* @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=32)
*/
private $salt;
/**
* @ORM\Column(type="string", length=250)
*/
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")
*
*/
private $roles;
Роль сущности
/**
* @ORM\Column(name="id", type="integer")
* @ORM\Id()
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(name="name", type="string", length=30)
*/
private $name;
/**
* @ORM\Column(name="role", type="string", length=20, unique=true)
*/
private $role;
/**
* @ORM\ManyToMany(targetEntity="User", mappedBy="roles")
* @ORM\JoinTable(name="user_role",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")}
* )
*/
private $users;
public function __construct()
{
$this->users = new ArrayCollection();
}
контроллер
public function editUserAction($id, Request $request)
{
$em = $this->getDoctrine()->getManager();
$user = $em->getRepository('PsoLogBundle:User')->find($id);
$form = $this->createForm(new NewUserType(),$user);
$form->handleRequest($request);
if (!$user) {
throw $this->createNotFoundException(
'No news found for id ' . $id
);
}
if ($form->isValid()) {
$em->flush();
$this->get('session')->getFlashBag()->add('notice', 'User updated successfully');
}
$build['form'] = $form->createView();
return $this->render('PsoLogBundle:Security:editUser.html.twig', $build);
}
Теперь у меня есть коллекция форм с пользователем и ролью, которая сохраняется в БД для пользователя. Когда я делаю изменения в роли, я получил ошибку "Исключение произошло при выполнении" UPDATE pso_role SET role =? WHERE id =? ' с параметрами ["ROLE_ADMIN", 2] "
Проблема в том, что Symfony хочет внести изменения в таблицу для роли Entity. На самом деле это должна быть новая запись в таблице для отношения User-Role. Я искал в Google и здесь, в stackoverflow, но я не могу найти то, что мне нужно изменить.
Я думаю, что проблема, возможно, в формообразователе
$builder ->add('username','text', array('label' => 'Username'))
->add('email','email', array('label' => 'Email'))
->add('isActive','text', array('label' => 'User aktiv'))
->add('Roles', 'collection', array('type' => new RoleType()))
->add('Submit', 'submit', array( 'attr'=> array ( 'formnovalidate' => 'formnovalidate' )));
может ли быть, что строка add ("Роли", "Коллекция", массив ("тип" => new RoleType())) определяет объект, который необходимо обновить? Могу ли я изменить это
Если я не использую его с набором форм, но только с одной формой, все работает нормально, потому что тогда затрагивается только одна сущность. Я был бы рад, если кто-нибудь может дать мне подсказку.
Теперь я попробовал его в Formbuilder с → add ('role', 'entity', array ('class' => 'PsoLogBundle: Role', 'property' => 'role'))
Затем я получаю сообщение об ошибке "Ни свойства" роли ", ни один из методов" setRoles() "," __set() "или" __call() "не существуют и имеют открытый доступ в классе" Pso\LogBundle\Entity\User ",.
Я попытался вставить в Entity User установщик
public function setRoles( ArrayCollection $roles)
{
$this->roles = $roles;
return $this;
}
Затем я получаю сообщение об ошибке ContextErrorException: Catchable Fatal Error: аргумент 1, переданный в Pso\LogBundle\Entity\User :: setRoles(), должен быть экземпляром Pso\LogBundle\Entity\ArrayCollection, экземпляр Pso\LogBundle\Entity\Role given, вызывается в C:\xampp\htdocs\pso\vendor\symfony\symfony\src\Symfony\Component\PropertyAccess\PropertyAccessor.php в строке 347 и определен в C:\xampp\htdocs\pso\src\Pso\LogBundle\Entity\User.php строка 99
Я попытался решить проблему с помощью
'multiple' => false,
как я нашел здесь
Но это не меняет ситуацию.
Я добавил в user.php сеттер для роли
// Important
public function setRoles($roles)
{
foreach($roles as $p)
{
$po = new user_role();
$po->setUser($this);
$po->setRoles($p);
$this->addPo($po);
}
}
Когда я это делаю и создаю сеттеры и получатели нового, я не получаю ошибки при изменении роли для пользователя, но в БД запись не изменяется.
После многочасового поиска я получил его сейчас. Правильный сеттер прав. Кроме того, я изменил формулятор, как
->add('roles', 'entity', array('class' => 'PsoLogBundle:Role','property' => 'role','multiple' => true,))
Теперь роль изменяется правильно, когда я отправляю форму. Спасибо, что всегда отвечал, так что я получил правильное направление. Надеюсь, теперь все будет хорошо.
Приветствие Micha
Вы должны иметь в своем пользовательском объекте:
/**
* @ORM\ManyToMany(targetEntity="Role", inversedBy="users")
* @ORM\JoinTable(name="role_assigned_to_user",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")}
* )
*/
private $roles;
В вашей роли:
/**
* @ORM\ManyToMany(targetEntity="User", mappedBy="roles")
*/
private $users;
в конструкторе ролей:
public function __construct() {
$this->users = new \Doctrine\Common\Collections\ArrayCollection();
}
Вместо коллекции он будет выбирать несколько:
->add('roles', 'entity', array(
'class' => 'YourBundle:Role',
'property' => 'name',
))