Frage

Ich bin neu in Symfony. Ich habe beschlossen, mein Rad mit Symfony Version 2 zu bewegen.

In meiner Benutzerform:

  • Ich möchte die Einzigartigkeit von E -Mails in der Datenbank validieren.
  • Ich möchte auch das Kennwort mit dem Feld Bestätigung Passwort validieren.
  • Ich konnte jede Hilfe im Symfony2 Doc finden.
War es hilfreich?

Lösung

Dieses Zeug hat mir auch eine Weile gebraucht, um aufzuspüren, also hier ist, was ich mir ausgedacht habe. Um ehrlich zu sein, bin ich mir nicht sicher, ob die GetRoles () -Methode der Benutzerentität, aber dies ist nur ein Test -Setup für mich. Kontextelemente wie diese werden ausschließlich zur Klarheit bereitgestellt.

Hier sind einige hilfreiche Links zum weiteren Lesen:

Ich habe dies alles eingerichtet, um sicherzustellen, dass es auch für Sicherheit als Benutzerprovider funktioniert hat, da ich dachte, dass Sie das wahrscheinlich getan haben. Ich nahm auch an, dass Sie die E -Mail als Benutzername verwendet haben, aber Sie müssen es nicht. Sie können ein separates Benutzernamefeld erstellen und dies verwenden. Sehen Sicherheit für mehr Informationen.

Die Entität (nur die wichtigen Teile; autogeneratable Getter/Setter werden weggelassen):

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;
    }
}
?>

Die Formklasse:

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',
        );
    }
}
?>

Der Controller:

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");
    }

Relevanter Abschnitt von 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: ~

Andere Tipps

Kasse http://github.com/friendsofsymfony Es gibt eine Benutzerbund mit dieser Funktionalität. Sie können auch überprüfen http://blog.bearwoods.com Wo ein Blog -Beitrag zum Hinzufügen eines benutzerdefinierten Feldes, eines benutzerdefinierten Einschränkung und eines Validators für Recaptcha vorhanden ist.

Thoose Resources sollten Sie auf dem richtigen Weg beginnen, wenn Sie immer noch in Schwierigkeiten geraten, dass die Leute im IRC bei #Symfony-Dev im Freenode-Netzwerk im Allgemeinen hilfsbereit und freundlich sind. Auf Freenoce gibt es auch einen allgemeinen Kanal #Symfony, in dem Sie Fragen zur Verwendung von Sachen stellen können, bei denen #Symfony-Dev für die Entwicklung von Symfony2 Core dient.

Hoffentlich hilft Ihnen dies dabei, Ihr Projekt voranzutreiben.

Ich denke, die Hauptsache, auf die Sie beim Erstellen Ihres benutzerdefinierten Validators achten müssen, ist die in der Methode GetTarget () angegebene Konstante.

Wenn Sie sich ändern

self::PROPERTY_CONSTRAINT

zu:

self::CLASS_CONSTRAINT

Sie sollten in der Lage sein, auf alle Eigenschaften des Unternehmens zugreifen zu können, nicht nur auf eine einzelne Eigenschaft.


Hinweis: Wenn Sie Anmerkungen verwenden, um Ihre Einschränkungen zu definieren, müssen Sie jetzt die Annotation verschieben, die Ihren Validator auf die Spitze der Klasse definiert, da sie jetzt für das gesamte Unternehmen und nicht nur für die einzelne Eigenschaft anwendbar ist.

Sie sollten in der Lage sein, alles zu bekommen, was Sie von der benötigen Dokumente. Speziell die Einschränkungen Dies enthält Informationen zur E -Mail -Überprüfung. Es gibt auch Unterlagen zum Schreiben benutzerdefinierte Validatoren.

Ich habe alles wie auf getan http://symfony.com/doc/2.0/book/validation.html

Meine Konfiguration:

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

versuchte es mit zu benutzen mit

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

Aber es wird nicht ausgelöst?

Eindeutige E -Mail aus der Datenbank

validierung.yml

Dashboard articleBundle Entity Artikel: Einschränkungen: # - Symfony Bridge Doktrin Validator Einschränkungen UniqueEntity: SENTEREMAIL - SYMFONY BRIDGE DOCTRINE VALIDERATOR Einschränkungen UniqueEntity: {Fields: Senderemail, Nachrichten: Diese E -Mail: Diese E -Mail -E -Mail -E -Mails: Diese E -Mail -E -Mail -E -Mails: Diese E -Mail -E -Mails: Diese E -Mail -E -Mails: Diese E -Mail bereits E -Mail: Diese E -Mail: Diese E -Mail: Diese E -Mail -E -Mail -Einschränkung} bereits E -Mail:

Passwort mit Passwort bestätigen

    $builder->add('password', 'repeated', array(
       'first_name' => 'password',
       'second_name' => 'confirm',
       'type' => 'password',
       'required' => false,
    ));
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top