Custom validering i symfony2

stemmer
8

Jeg er ny på symfony. Jeg har besluttet å flytte mitt hjul med Symfony versjon 2.

I min bruker skjemaet:

  • Jeg ønsker å validere unikhet av e-post i databasen.
  • Jeg vil gjerne også validere passord med feltet Bekreft passord.
  • Jeg kunne finne noen hjelp i symfony2 doc.
Publisert på 15/03/2011 klokken 10:32
kilden bruker
På andre språk...                            


6 svar

stemmer
24

Dette ting tok meg en stund å spore opp også, så her er hva jeg kom opp med. For å være ærlig er jeg ikke helt sikker på om getRoles () metoden i Bruker enhet, men dette er bare en test oppsett for meg. Kontekst elementer som det er kun for klarhet.

Her er noen nyttige lenker for videre lesing:

Jeg satt dette opp for å sørge for at det fungerte som en UserProvider for sikkerhet også, ettersom jeg skjønte du sannsynligvis gjøre det. Jeg antok at du var ved hjelp av e-post som brukernavn, men du trenger ikke å. Du kan opprette et eget brukernavn felt og bruke det. Se Sikkerhet for mer informasjon.

The Entity (kun de viktigste delene; autogenerateable getters / settere er utelatt):

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

Skjema klasse:

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

Kontrolleren:

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

Relevante delen av 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: ~
Svarte 19/08/2011 kl. 21:57
kilden bruker

stemmer
1

Jeg tror det viktigste du trenger å se etter når du oppretter egendefinerte validator er konstant spesifisert i getTargets () -metoden.

Hvis du endrer

self::PROPERTY_CONSTRAINT

til:

self::CLASS_CONSTRAINT

Du bør være i stand til å få tilgang til alle eiendommer i foretaket, ikke bare en enkelt eiendom.


Merk: Hvis du bruker kommentarer å definere begrensninger vil du nå trenger å flytte kommentaren som definerer din validator opp til toppen av klassen som det er nå skal gjelde for hele foretaket og ikke bare enkelt eiendom.

Svarte 12/05/2011 kl. 15:53
kilden bruker

stemmer
1

Sjekk ut http://github.com/friendsofsymfony det er en UserBundle som har den funksjonaliteten. Du kan også sjekke http://blog.bearwoods.com hvor det er et blogginnlegg om å legge et egendefinert felt, begrensning og validator for Recaptcha.

Thoose ressurser bør komme i gang på rett vei hvis du fortsatt kjører i trøbbel folk er generelt hjelpsomme og vennlige på irc på # symfony-dev på Freenode nettverket. På Freenoce er det også en generell kanal #symfony hvor du kan stille spørsmål om hvordan du kan bruke ting der # symfony-dev er for utvikling av Symfony2 Core.

Forhåpentligvis vil dette hjelpe deg å gå videre med prosjektet.

Svarte 15/03/2011 kl. 13:58
kilden bruker

stemmer
0

Jeg har gjort alt som på http://symfony.com/doc/2.0/book/validation.html

Min config:

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

prøvde å bruke den med

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

men det ikke er utløst?

Svarte 15/05/2011 kl. 07:45
kilden bruker

stemmer
0

Du bør være i stand til å få alt du trenger fra docs . Spesielt de føringer som har informasjon om e-kontroll. Det er også dokumentasjon på å skrive egne validatorer .

Svarte 15/03/2011 kl. 12:12
kilden bruker

stemmer
-1

unik e-post fra database

validation.yml

Dashboard \ ArticleBundle \ Entity \ Artikkel: begrensninger: # - Symfony \ Bridge \ Lære \ Validator \ Begrensninger \ UniqueEntity: SENDERE - Symfony \ Bridge \ Lære \ Validator \ Begrensninger \ UniqueEntity: {felt: SENDERE, melding: Denne e-posten allerede eksisterer}

Passord med confirm passord

    $builder->add('password', 'repeated', array(
       'first_name' => 'password',
       'second_name' => 'confirm',
       'type' => 'password',
       'required' => false,
    ));
Svarte 10/07/2013 kl. 13:16
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more