Php 错误:调用数组上的成员函数setPassword()

Php 错误:调用数组上的成员函数setPassword(),php,forms,symfony,Php,Forms,Symfony,我在使用Symfony的应用程序中遇到新用户注册表问题。我首先在控制器中创建了表单,它工作正常,但当将表单移动到RegisterFormType.php时,我开始面临标题中所述的问题,当时我正试图保存用户 下面是表单类: namespace SF2\UserBundle\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; class RegisterFo

我在使用Symfony的应用程序中遇到新用户注册表问题。我首先在控制器中创建了表单,它工作正常,但当将表单移动到
RegisterFormType.php
时,我开始面临标题中所述的问题,当时我正试图保存用户

下面是表单类:

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())

我想显示这个代码就足够了,但是请在我的


非常感谢。

您的表单类型不处理用户类,因为您没有设置该类,这就是为什么
$form->getData()
返回数组而不是对象用户

在formType中添加:

use Symfony\Component\OptionsResolver\OptionsResolverInterface;

...

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

表单类型不处理用户类,因为您没有设置该类,这就是为什么
$form->getData()
返回数组而不是object User

在formType中添加:

use Symfony\Component\OptionsResolver\OptionsResolverInterface;

...

public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'SF2\UserBundle\Entity\User',
        ));
    }
getDefaultOptions现在已弃用,它不接受$options参数,此处建议使用闭包。我知道您使用的是较旧版本的symfony,所以请尝试一下,看看,这段代码没有经过我的测试,因为我没有较旧的版本


getDefaultOptions现在已弃用,它不接受$options参数,此处建议使用闭包。我知道您使用的是较旧版本的symfony,所以请尝试一下,我没有测试过此代码,因为我没有较旧版本

基于这两个答案,我可能知道要搜索什么,我找到了解决方案:

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'SF2\UserBundle\Entity\User'
    ));
}
使用
configureOptions
而不是
setDefaultOptions


非常感谢。

基于这两个答案,我对搜索内容有了一个想法,并找到了解决方案:

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'SF2\UserBundle\Entity\User'
    ));
}
使用
configureOptions
而不是
setDefaultOptions


非常感谢。

您好,谢谢您的回答,但仍然不起作用。它还向我展示了我们应该使用的
选项resolver
,因为
接口将被删除。我使用的是2.7版,但我基于2012年的教程,这就是为什么。您好,谢谢您的回答,但它仍然不起作用。它还向我展示了我们应该使用的
选项resolver
,因为
接口将被删除。我使用的是2.7版,但我基于2012年的教程,这就是为什么。