2015-08-20 4 views
1

У меня возникла проблема с регистрационной формой для новых пользователей в моем приложении с Symfony. Сначала я создал форму внутри контроллера, и она работала корректно, но при перемещении формы на RegisterFormType.php я начал сталкиваться с проблемой, упомянутой в названии, при попытке сохранить пользователя.Ошибка: вызов функции-члена setPassword() в массиве

Ниже форма класс:

namespace SF2\UserBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 

class RegisterFormType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add(
       'username', 'text', array(
        'pattern' => '[a-zA-Z0-9]+', 
        'attr' => array(
         'class' => 'form-control' 
        ) 
       ) 
      ) 

      ->add(
       'plainPassword', 'repeated', array(
        'type' => 'password', 
        'first_options' => array(
         'label' => 'Password' 
        ), 
        'second_options' => array(
         'label' => 'Repeat Password' 
        ), 
        'options' => array(
         'attr' => array(
          'class' => 'form-control' 
         ) 
        ) 
       ) 
      ) 

      ->add(
       'email', 'email', array(
        'attr' => array(
         'class' => 'form-control' 
        ) 
       ) 
      ); 
    } 

    public function getDefaultOptions(array $options) 
    { 
     return array(
      'data_class' => 'SF2\UserBundle\Entity\User' 
     ); 
    } 

    public function getName() 
    { 
     return 'user_register'; 
    } 
} 

Следующий класс является обработка процесса регистрации

namespace SF2\UserBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpFoundation\Request; 
use SF2\UserBundle\Form\RegisterFormType; 

class RegisterController extends Controller 
{ 
    public function registerAction(Request $request) 
    { 
     $form = $this->createForm(new RegisterFormType()); 

     if ($request->getMethod() == 'POST') { 
      $form->submit($request); 

      if ($form->isValid()) { 
       $user = $form->getData(); 
       $user->setPassword($this->encodePassword($user, $user->getPlainPassword())); 

       $em = $this->getDoctrine()->getManager(); 
       $em->persist($user); 
       $em->flush(); 

       return $this->redirect($this->generateUrl('catalog')); 
      } 
     } 

     return $this->render('UserBundle:Register:register.html.twig', array(
      'form' => $form->createView() 
     )); 
    } 

    public function encodePassword($user, $plainPassword) 
    { 
     $encoder = $this->container->get('security.encoder_factory') 
            ->getEncoder($user); 

     return $encoder->encodePassword($plainPassword, $user->getSalt()); 
    } 
} 

объекта пользователя Контроллер:

namespace SF2\UserBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Security\Core\User\UserInterface; 
use Symfony\Component\Security\Core\User\AdvancedUserInterface; 
use Serializable; 
use Symfony\Component\Validator\Constraints as Assert; 

/** 
* User 
* 
* @ORM\Table() 
* @ORM\Entity(repositoryClass="SF2\UserBundle\Entity\UserRepository") 
*/ 
class User implements AdvancedUserInterface 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="username", type="string", length=255) 
    * @Assert\NotBlank(message="Enter an username") 
    */ 
    private $username; 

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

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

    /** 
    * @var array 
    * 
    * @ORM\Column(type="array") 
    */ 
    private $roles = array(); 

    /** 
    * @var bool 
    * 
    * @ORM\Column(type="boolean") 
    */ 
    private $isActive = true; 

    /** 
    * @var string 
    * 
    * @ORM\Column(type="string", length=255) 
    * @Assert\NotBlank() 
    * @Assert\Email() 
    */ 
    private $email; 

    /** 
    * 
    * @var string 
    */ 
    private $plainPassword; 

    public function __construct() 
    { 
     $this->salt = base_convert(sha1(uniqid(mt_rand(), true)), 16, 36); 
    } 

    /** 
    * 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; 
    } 

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

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

     return $this; 
    } 

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

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

     return $this; 
    } 

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

    /** 
    * Set user's roles 
    * 
    * @param type $roles 
    * @return type 
    */ 
    public function setRoles(array $roles) 
    { 
     $this->roles = $roles; 
    } 

    /** 
    * Get roles. 
    * Sets default role as regular user 
    * 
    * @return Array 
    */ 
    public function getRoles() 
    { 
     $roles = $this->roles; 
     $roles[] = 'ROLE_USER'; 

     return array_unique($roles); 
    } 

    /** 
    * Set user's status 
    * 
    * @param type $isActive 
    */ 
    function setIsActive($isActive) 
    { 
     $this->isActive = $isActive; 
    } 

    /** 
    * Get user's status 
    * 
    * @return bool 
    */ 
    function getIsActive() 
    { 
     return $this->isActive; 
    } 

    /** 
    * 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 plainPassword 
    * 
    * @param type $plainPassword 
    */ 
    function setPlainPassword($plainPassword) 
    { 
     $this->plainPassword = $plainPassword; 
    } 

    /** 
    * Get plainPassword 
    * 
    * @return string 
    */ 
    function getPlainPassword() 
    { 
     return $this->plainPassword; 
    } 

    /** 
    * Compares the user ID 
    * 
    * @param UserInterface $user 
    * @return boolean 
    */ 
    public function equals(UserInterface $user) 
    { 
     return $this->getId() == $user->getId(); 
    } 

    public function eraseCredentials() 
    { 
     $this->setPassword(null); 
    } 

    public function isAccountNonExpired() 
    { 
     return true; 
    } 

    public function isAccountNonLocked() 
    { 
     return true; 
    } 

    public function isCredentialsNonExpired() 
    { 
     return true; 
    } 

    public function isEnabled() 
    { 
     return $this->getIsActive(); 
    } 

    public function serialize() 
    { 
     return serialize(array(
      'id' => $this->getId() 
     )); 
    } 

    public function unserialize($serialized) 
    { 
     $data = unserialize($serialized); 
     $this->id = $data['id']; 
    } 

} 

точек трассировки стека В Symfony в ошибка в этой строке: $user->setPassword($this->encodePassword($user, $user->getPlainPassword()));

Я думаю, показывая этот код достаточно, но вы можете проверить это в моем github

глубоко признателен.

ответ

0

Тип формы не обрабатывает класс пользователя, потому что вы не устанавливаете этот класс, поэтому $form->getData() возвращает массив вместо объекта Пользователь.

В formType добавить:

use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

... 

public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'SF2\UserBundle\Entity\User', 
     )); 
    } 
0
public function getDefaultOptions() 
{ 
    return function (OptionsResolverInterface $resolver) { 

      return $resolver->setDefaults(array(
      'data_class' => 'SF2\UserBundle\Entity\User' 
      ));   

     } 
} 

getDefaultOptions теперь осуждается, он не принимает параметр $ параметров, использование замыканий предлагается здесь. Я понимаю, что вы используете более старую версию symfony, поэтому попробуйте это и посмотрите, этот код не проверен мной, поскольку у меня нет старой версии.

+0

Здравствуйте, благодарю вас за ответ, но он все еще не работает. Это также показало, что «OptionsResolver» - это тот, который мы должны использовать, поскольку «Интерфейс» будет удален. Я использую версию 2.7, но я основывался на учебнике с 2012 года, вот почему. – mfgabriel92

0

Основываясь на двух ответах, я мог бы иметь представление о том, что искать, и я нашел решение:

public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'SF2\UserBundle\Entity\User' 
    )); 
} 

использование configureOptions вместо setDefaultOptions

Оценил.

Смежные вопросы