Вопрос

Я новичок в Symfony.Я решил перейти на Symfony версии 2.

В моей пользовательской форме:

  • Я хотел бы проверить уникальность электронной почты в базе данных.
  • Я хотел бы также проверить пароль с помощью поля подтверждения пароля.
  • Я мог бы найти любую помощь в документе symfony2.
Это было полезно?

Решение

Это потребовалось некоторое время, чтобы отследить, так что вот что я придумал. Честно говоря, я не совсем уверен в методе getRoles () объекта пользователя, но это просто настройка теста для меня. Подобные элементы контекста предоставляются исключительно для ясности.

Вот несколько полезных ссылок для дальнейшего чтения:

Я установил все это, чтобы убедиться, что это работало как пользовательский проводщик для безопасности, так как я подумал, что вы, вероятно, делаете это. Я также предположил, что вы использовали электронное письмо в качестве имени пользователя, но вам не нужно. Вы можете создать отдельное поле пользователя и использовать это. Видеть Безопасность Чтобы получить больше информации.

Сущность (только важные части; автогенератируемые гетры/сеттеры опущены):

namespace Acme\UserBundle\Entity;

use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Bridge\Doctrine\Validator\Constraints as DoctrineAssert;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity()
 * @ORM\HasLifecycleCallbacks()
 *
 * list any fields here that must be unique
 * @DoctrineAssert\UniqueEntity(
 *     fields = { "email" }
 * )
 */
class User implements UserInterface
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string", length="255", unique="true")
     */
    protected $email;

    /**
     * @ORM\Column(type="string", length="128")
     */
    protected $password;

    /**
     * @ORM\Column(type="string", length="5")
     */
    protected $salt;

    /**
     * Create a new User object
     */
    public function __construct() {
        $this->initSalt();
    }

    /**
     * Generate a new salt - can't be done as prepersist because we need it before then
     */
    public function initSalt() {
        $this->salt = substr(str_shuffle(str_repeat('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',5)),0,5);
    }

    /**
     * Is the provided user the same as "this"?
     *
     * @return bool
     */
    public function equals(UserInterface $user) {
        if($user->email !== $this->email) {
            return false;
        }

        return true;
    }

    /**
     * Remove sensitive information from the user object
     */
    public function eraseCredentials() {
        $this->password = "";
        $this->salt = "";
    }


    /**
     * Get the list of roles for the user
     *
     * @return string array
     */
    public function getRoles() {
        return array("ROLE_USER");
    }

    /**
     * Get the user's password
     *
     * @return string
     */
    public function getPassword() {
        return $this->password;
    }

    /**
     * Get the user's username
     *
     * We MUST have this to fulfill the requirements of UserInterface
     *
     * @return string
     */
    public function getUsername() {
        return $this->email;
    }

    /**
     * Get the user's "email"
     *
     * @return string
     */
    public function getEmail() {
        return $this->email;
    }

    /**
     * Get the user's salt
     *
     * @return string
     */
    public function getSalt() {
        return $this->salt;
    }

    /**
     * Convert this user to a string representation
     *
     * @return string
     */

    public function __toString() {
        return $this->email;
    }
}
?>

Форма класса:

namespace Acme\UserBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

class UserType extends AbstractType {
    public function buildForm(FormBuilder $builder, array $options) {
        $builder->add('email');
        /* this field type lets you show two fields that represent just
           one field in the model and they both must match */
        $builder->add('password', 'repeated', array (
            'type'            => 'password',
            'first_name'      => "Password",
            'second_name'     => "Re-enter Password",
            'invalid_message' => "The passwords don't match!"
        ));
    }

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

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

Контроллер:

namespace Acme\UserBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Acme\UserBundle\Entity\User;
use Acme\UserBundle\Form\Type\UserType;


class userController extends Controller
{
    public function newAction(Request $request) {
        $user = new User();
        $form = $this->createForm(new UserType(), $user);

        if ($request->getMethod() == 'POST') {
            $form->bindRequest($request);

            if ($form->isValid()) {
                // encode the password
                $factory = $this->get('security.encoder_factory');
                $encoder = $factory->getEncoder($user);
                $password = $encoder->encodePassword($user->getPassword(), $user->getSalt());
                $user->setPassword($password);

                $em = $this->getDoctrine()->getEntityManager();
                $em->persist($user);
                $em->flush();

                return $this->redirect($this->generateUrl('AcmeUserBundle_submitNewSuccess'));
            }
        }

        return $this->render('AcmeUserBundle:User:new.html.twig', array (
            'form' => $form->createView()
        ));
    }

    public function submitNewSuccessAction() {
        return $this->render("AcmeUserBundle:User:submitNewSuccess.html.twig");
    }

Соответствующий раздел Security.yml:

security:
    encoders:
        Acme\UserBundle\Entity\User:
            algorithm: sha512
            iterations: 1
            encode_as_base64: true

    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]

    providers:
        main:
            entity: { class: Acme\UserBundle\Entity\User, property: email }

    firewalls:
        secured_area:
            pattern:    ^/
            form_login:
                check_path: /login_check
                login_path: /login
            logout:
                path:   /logout
                target: /demo/
            anonymous: ~

Другие советы

Проверить http://github.com/friendsofsymfony существует UserBundle с такой функциональностью.Вы также можете проверить http://blog.bearwoods.com где есть сообщение в блоге о добавлении настраиваемого поля, ограничения и валидатора для Recaptcha.

Эти ресурсы помогут вам встать на правильный путь, если вы все еще сталкиваетесь с проблемами, люди, как правило, готовы помочь и дружелюбны в irc #symfony-dev в сети Freenode.На Freenoce также есть общий канал #symfony, где вы можете задавать вопросы о том, как использовать материал #symfony-dev для разработки Symfony2 Core.

Надеюсь, это поможет вам продвинуться вперед в вашем проекте.

Я думаю, что главное, что вам нужно обратить внимание при создании пользовательского валидатора, - это постоянная указанная в методе getTargets ().

Если вы изменитесь

self::PROPERTY_CONSTRAINT

к:

self::CLASS_CONSTRAINT

Вы должны иметь возможность получить доступ ко всем свойствам объекта, а не только одному свойству.


ПРИМЕЧАНИЕ. Если вы используете аннотации для определения ваших ограничений, вам теперь нужно будет перемещать аннотацию, которая определяет ваш валидатор на вершину класса, поскольку теперь это применимо ко всему объекту, а не только для единого свойства.

Вы должны быть в состоянии получить все, что вам нужно от док. Анкет В частности ограничения который имеет информацию о проверке электронной почты. Также есть документация по написанию пользовательские валидаторы.

Я сделал все как на http://symfony.com/doc/2.0/book/validation.html

Моя конфигурация:

validator.debit_card:
        class: My\Validator\Constraints\DebitCardValidator
        tags:
            - { name: validator.constraint_validator, alias: debit_card }

пытался использовать его с

@assert:DebitCard
@assert:debitCard
@assert:debit_card

Но это не запускается?

Уникальное электронное письмо из базы данных

valyation.yml

Dashboard articleBundle Entity article: rustraints: # - symfony bridge doctrine validator routants uriningEntity: senderemail - symfony bridge doctrine validator constraints urbineentity: {fields: senderemail, сообщение: Это электронное письмо уже существует}

Пароль с подтверждением пароля

    $builder->add('password', 'repeated', array(
       'first_name' => 'password',
       'second_name' => 'confirm',
       'type' => 'password',
       'required' => false,
    ));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top