0

Default Symfony User クラスを使用するログインフォーム用の Form クラスを作成したいと考えています。

ここで本をたどりました: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);

そして、私は2つの問題を抱えています:

  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 に答える