具有窗体类的默认Symfony用户实体


Default Symfony User Entity with Form Class

我希望为使用Default Symfony User类的登录表单创建一个Form类。

我把书放在这里:http://symfony.com/doc/current/book/security.html#using-a-的传统登录

现在我想把html变成一个Form类,我为它做了:

use Symfony'Component'Form'AbstractType;
use Symfony'Component'Form'FormBuilderInterface;
use Symfony'Component'OptionsResolver'OptionsResolverInterface;
class LoginForm extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('_username', 'text');
        $builder->add('_password', 'password');
    }
    
    public function getName()
    {
        return 'login';
    }
    
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
                'data_class' => 'Symfony'Component'Security'Core'User'User',
        ));
    }
}

这应该行得通。

现在我试着这样称呼它:

$user = new 'Symfony'Component'Security'Core'User'User('ana', 'anon');
$form = $this->createForm(new LoginForm(), $user);

我有两个问题:

  1. user类要求我指定一个用户名和密码,这根本不是我想要的。我希望这是一个登录表单,而不是创建一个用户表单

  2. 当我尝试渲染时,它会抛出一个错误:

    Neither property "_username" nor method "get_username()" nor method 
    "is_username()" exists in class "Symfony'Component'Security'Core'User'User"
    500 Internal Server Error - InvalidPropertyException
    

我做错了什么?我还不想使用FOSUserBundle,我想学习默认的Symfony类,你可以为此称我为白痴。

编辑:我删除了字段名称中的下划线(_),它开始工作,但第一个问题仍然存在,现在我遇到了一个新问题:

如果我试图提交我的表格,我得到的只是Bad credentials证书。

login.html.twig:

<form action="{{ path('main_login_check') }}" method="post">
    {{ form_widget(form) }}
    <button type="submit">login</button>
</form>

这就是所谓的行动:

public function loginAction()
    {
        $request = $this->getRequest();
        $session = $request->getSession();
        $user = new 'Symfony'Component'Security'Core'User'User('ana', 'anon');
        $form = $this->createForm(new LoginForm(), $user);
        // get the login error if there is one
        if ($request->attributes->has(SecurityContext::AUTHENTICATION_ERROR))
        {
            $error = $request->attributes->get(
                    SecurityContext::AUTHENTICATION_ERROR
                    );
        }
        else 
        {
            $error = $session->get(SecurityContext::AUTHENTICATION_ERROR);
            $session->remove(SecurityContext::AUTHENTICATION_ERROR);
        }
        
        return $this->render(
                'BattlemamonoMainBundle:Security:login.html.twig',
                array(
                        // last username entered by the user
                        'last_username'   => $session->get(SecurityContext::LAST_USERNAME),
                        'error'           => $error,
                        'form'            => $form->createView(),
                        )
                );
    }

核心User类中的属性是"username"answers"password",而不是_username和_password-它们需要匹配,或者您需要在表单生成器中指定属性名称映射以避免上述异常。

此建议适用于将表单映射到一般实体。