0

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

我在这里跟着这本书:http: //symfony.com/doc/current/book/security.html#using-a-traditional-login-form

现在我希望将该 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. 用户类要求我指定一个用户名和密码,这根本不是我想要的。我希望这是一个登录表单,而不是创建用户表单。

  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(),
                        )
                );
    }
4

1 回答 1

1

核心 User 类中的属性是 'username' 和 'password',与 _username 和 _password 相反 - 它们需要匹配,否则您需要在表单构建器中指定属性名称映射以避免上述异常。

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

于 2013-02-08T11:33:49.760 回答