2012-09-28 6 views
1

작은 프로젝트에 Silex를 사용하고 있지만 일치하는 두 개의 비밀번호 필드를 확인하는 방법과 데이터베이스 연결을 사용하여 이메일의 고유성을 확인하는 방법을 모르겠습니다. 나는 SF2 문서에서 그것을 파악할 수 없었다.Symfony 유효성 검사기를 사용하여 일치 확인 및 고유 확인

가능한 사람이 내게 힌트 또는 샘플을 줄 수 있습니까? 사전

if ('POST' === $user->getMethod()) { 

    $constraint = new Assert\Collection(array(
     'name' => array(new Assert\NotBlank(array('message' => 'Name shouldnt be blank'))), 
     'username' => array(new Assert\NotBlank(), new Assert\MinLength(3)), 
     'email' => array(new Assert\NotBlank(), new Assert\Email()), 
     'password' => array(new Assert\NotBlank(), new Assert\MinLength(6)), 
     'password2' => array(new Assert\NotBlank(), new Assert\MinLength(6)), 
     'terms' => array(new Assert\True()), 
    )); 

    $errors = $app['validator']->validateValue($user->request->all(), $constraint); 

    if (!count($errors)) { 
    //do something 
    } 
} 
+1

Silex는 직접 사용하지 않지만 S2에서는 UniqueEntity 제약 조건 (http://symfony.com/doc/current/reference/constraints/UniqueEntity.html)과 고유 한 전자 메일에 대한 반복 필드 (http : //symfony.com/doc/current/reference/forms/types/repeated.html) – Cerad

+0

일부 기능을 추가함에 따라 Symfony 양식을 사용하도록 전환되었습니다 :) 여전히 고유성을 작동시키는 방법에 대해서는 의심의 여지가 없습니다. – Kristian

답변

5

에서

덕분에 나는 당신이 이미 Sf2에 형태로 전환 코멘트에 참조하십시오. 당신이 RepeatedType 필드를 찾은 것 같아요, 이것은 등록 양식의 반복 된 암호 필드에 가장 적합합니다 - 두 값이 일치하는지 확인하기위한 내장 체크가 있습니다.

다른 문제는 이메일 주소의 고유성을 검사하는 것입니다.

<?php 

namespace Insolis\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 
use Symfony\Component\Validator\Constraints as Assert; 
use Symfony\Component\Validator\ExecutionContext; 

class RegisterType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $app = $options["app"]; 

     $builder->add("email", "email", array(
      "label"   => "E-mail address", 
      "constraints" => array(
       new Assert\NotBlank(), 
       new Assert\Email(), 
       new Assert\Callback(array(
        "methods" => array(function ($email, ExecutionContext $context) use ($app) { 
         if ($app["user"]->findByEmail($email)) { 
          $context->addViolation("Email already used"); 
         } 
        }), 
       )), 
      ), 
     )); 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     parent::setDefaultOptions($resolver); 
     $resolver->setRequired(array("app")); 
    } 

    public function getName() 
    { 
     return "register"; 
    } 
} 

참고 :

  • $app 내가 의존성 주입 컨테이너
  • $app["user"]에 액세스 할 수 있도록 주입 내 사용자 테이블 KnpRepositoryServiceProvider
  • $app["user"]->findByEmail를 통해 여기 내 등록 양식의 관련 부분입니다 null 또는 사용자 레코드를 반환합니다.