Пользовательская проверка в symfony2 - PullRequest
8 голосов
/ 15 марта 2011

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

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

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

Ответы [ 6 ]

24 голосов
/ 20 августа 2011

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

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

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

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

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: ~
1 голос
/ 12 мая 2011

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

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

self::PROPERTY_CONSTRAINT

до:

self::CLASS_CONSTRAINT

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


Примечание. Если вы используете аннотации для определения своих ограничений, теперь вам нужно переместить аннотацию, которая определяет ваш валидатор, на вершину класса, поскольку теперь она применима ко всему объекту, а не только к одному свойству. 1012 *

1 голос
/ 15 марта 2011

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

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

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

0 голосов
/ 10 июля 2013

уникальный адрес электронной почты из базы данных

validation.yml

Панель инструментов \ ArticleBundle \ Entity \ Article: constraints: # - Symfony \ Bridge \ Doctrine \ Validator \ Constraints \ UniqueEntity: senderEmail - Symfony \Bridge \ Doctrine \ Validator \ Constraints \ UniqueEntity: {fields: senderEmail, message: Этот адрес электронной почты уже существует}

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

    $builder->add('password', 'repeated', array(
       'first_name' => 'password',
       'second_name' => 'confirm',
       'type' => 'password',
       'required' => false,
    ));
0 голосов
/ 15 мая 2011

Я сделал все как на 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

, но он не срабатывает

0 голосов
/ 15 марта 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...