0

自分のサイトに role_user としてログインし、プロファイルを編集しようとすると、DB でログインを何かのログインとして変更しようとすると、「このログインは既に使用されています」というエラーが表示されますが、更新するとページに新しいログインとして承認されていることがわかりますが、良くありません

私はこのフォームビルダーを持っています:

namespace User\WalletBundle\Form;

use Doctrine\ORM\EntityRepository;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class EditForm extends AbstractType {

    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder->add('username', null, array('attr' => array('placeholder' => 'Login')));
        $builder->add('email', 'email', array('attr' => array('placeholder' => 'E-mail')));
        $builder->add('mobile', 'number', array('attr' => array('placeholder' => 'Mobile','maxlength' => 10)));
        $builder->add('password', 'repeated', array(
            'type' => 'password',
            'invalid_message' => 'Пароли не совпадают',
            'options' => array('label'=>'','required' => false, 'always_empty' => false)));


        $builder->add('old_pass','password',array('attr' => array('placeholder' => 'Old pass')));

    }

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

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

}

このシステムがどのように機能するか (セキュリティ) がよくわからないと思います。私の問題について読むことができるかもしれません。リンクを取得してください。どうもありがとう

私の英語について非常に申し訳ありません

私のコントローラーでは、テストのために、このコードを書きます

/**
     * @Secure(roles="ROLE_USER")
     * @Template("UserWalletBundle:Wallet:settings.html.twig")
     */
    public function settingsAction(Request $request) {
        $user_edit = $this->getDoctrine()->getRepository('UserWalletBundle:User')->findOneById($this->get('security.context')->getToken()->getUser()->getId());
        $form = $this->createForm(new EditForm(), $user_edit);
        if ($request->getMethod() == 'POST') {
            $form->bindRequest($request);
            // Now i have login Alice, and i want change my profile, set login Test, but Test is created some user in DB, ofcours i see error This login is already used
            if ($form->isValid()) {
            //Do anything
            } else {
            // There i see error This login is already used
                return array('form' => $form->createView());
            }
        } else
            return array('form' => $form->createView());
    }

そして今、ページを更新すると、ユーザー名(ログイン)「テスト」として認証されていることがわかります。なぜ、どのようにこの問題を解決できますか?

4

1 に答える 1

0

行で User エンティティを取得しているとき

$user_edit = $this->getDoctrine()->getRepository('UserWalletBundle:User')->findOneById($this->get('security.context')->getToken()->getUser()->getId());

現在の承認された User エンティティを取得します。

したがって、プロファイルを編集するには、別の User クラスを使用する必要があります。編集するフィールドが含まれている必要があります。フォームで作業するために使用する必要があります。また、成功フォームの検証と entityManager のフラッシュの後、現在の承認済みユーザーのフィールドを変更する必要があります。

なぜあなたの問題が起こるのかを説明しようと思います。しかし、私の英語も下手です。

PHP では、参照によってオブジェクトを渡したり返したりすることを知っていることを願っています。

Doctrine は IdentityMap パターンを実装しています。まもなく、DB からデータを取得しようとすると、Doctrine は取得したデータを特別な配列に入れます。つまり、DB からユーザーを取得すると、この特別な配列に追加されます。したがって、再度取得しようとすると、DB へのリクエストはありませんが、配列からのデータが返されます。

したがって、ログインすると、doctrine は DB から User を取得し (認可のために)、それを配列に入れました。また、Symfony の @security.context サービスは、この User のインスタンスを使用します。ここで、settingsAction で User を再度取得しようとすると、Doctrine はそれを配列から返します。バインド要求の後、ユーザー モデルが変更され (あなたの場合はログイン フィールドが変更されました)、Symfony の @security.context もこれらの変更について「認識」しています。フォームが無効であっても、投稿データはユーザーにマップされました。そのため、ページが更新された後に新しいログインが表示されます。ログアウトして再度ログインすると、バインド後に DB へのフラッシュが行われないため、「古い」ログインが表示されます。

これがお役に立てば幸いです。

psロシア語でもっとうまく説明できます:)

于 2013-05-28T18:29:01.067 に答える