У меня есть отношения один ко многим между моим пользователем и ролями. при создании нового пользователя я рендерил все роли из сущности ролей и рендерил ее с помощью формы создания пользователя. после ввода информации о пользователе и выбора ролей. при вставке в БД пишет
Warning: in_array() expects parameter 2 to be array, object given
Ниже мой код.
Пользовательский объект
/**
* @ORM\OneToMany(targetEntity="PNC\PermissionsBundle\Entity\Roles", mappedBy="users", cascade={"persist"})
* @var ArrayCollection $role
*/
private $role;
/**
* @return ArrayCollection A Doctrine ArrayCollection
*/
public function getRole()
{
return $this->role;
}
/**
* @param mixed $role
*/
public function setRole(ArrayCollection $role)
{
foreach($role as $rol) {
$rol->setUsers($this);
}
$this->role = $role;
}
public function __construct() {
parent::__construct();
$this->roles = new ArrayCollection();
}
Роли
/**
* @ORM\ManyToOne(targetEntity="Application\Sonata\UserBundle\Entity\User", inversedBy="role")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
private $users;
/**
* Set Users
*
* @param \Doctrine\Common\Collections\ArrayCollection $users
* @return Roles
*/
public function setUsers(ArrayCollection $users)
{
$this->users = $users;
return $this;
}
/**
* Get users
*
* @return \Doctrine\Common\Collections\ArrayCollection
*/
public function getUsers()
{
return $this->users;
}
и форма:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('firstname','text',array(
'label' => ucfirst('First Name *'),
'attr'=> array(
'class' => 'form-control',
'autocomplete' => 'off'
)))
->add('role', 'entity', array(
'class' => 'PNCPermissionsBundle:Roles',
'property' => 'role',
//'choice_list' => new SimpleChoiceList($optionArray),
'multiple' => true,
'expanded' => true,
'attr'=> array(
'class' => 'minimal',
'style' => 'position: absolute; opacity: 0;'
)
))
......
->add('save', 'submit', array(
'attr' => array('class' => 'submit'),
'label' => "Save"))
;
}
и контроллер:
public function newAction(Request $request){
$basePath = $request->getScheme().'://'.$request->getHost().$request->getBaseUrl();
$user = new User();
$form = $this->createForm(new UsersType(), $user, array(
'action' => $this->generateUrl('pnc_permissions_user_add'),
'method' => 'POST',
));
if ($request->getMethod() == 'POST')
{
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$factory = $this->get('security.encoder_factory');
$encoder = $factory->getEncoder($user);
$password = $encoder->encodePassword( $user->getPassword() , $user->getSalt());
$user->setPassword($password);
$em->persist($user);
$em->flush();
$this->get('session')->getFlashBag()->add('notice', 'New user created successfully.');
return $this->redirect($this->generateUrl('pnc_permissions_user_index'));
}
}
return $this->render('PNCPermissionsBundle:Users:add_user.html.twig', array(
'userForm' =>$form->createView(),
));
}
Новичок в symofny, не в состоянии разобраться в ошибке. Плюс я использую FOS пользователя также. и на странице ошибки это говорит об этом;
Stack Trace
in vendor/friendsofsymfony/user-bundle/FOS/UserBundle/Model/User.php at line 142 -
return $this;
}
if (!in_array($role, $this->roles, true)) {
$this->roles[] = $role;
}
используйте это вместо:
if (!$this->roles>contains($role)) {
$this->roles[] = $role;
}
in_array для массива и содержит за ArrayCollection
Других решений пока нет …