2013-08-05 9 views
1

Symfony 2 + FOSUserBundle을 사용하여 사용자를 관리하고 있습니다. 문제는 사용자 이름에서 "수동으로"이메일 주소를 만들고 싶습니다. 따라서 이메일 주소는 필요하지 않습니다.FOSUserBundle을 사용하여 수동으로 이메일 설정

가입 요구 사항 중 하나는 엄격한 형식 ([email protected])을 따르는 대학 이메일을 보내므로 사용자 이름에서 이메일을 생성합니다.

전자 메일 필드가 내 가입 페이지에 추가되지 않도록 RegistrationFormType을 무시할 수 있었지만 양식을 제출할 때 "전자 메일을 입력하십시오"라는 오류 메시지가 계속 나타납니다.

전자 메일 주소의 유효성을 어떻게 방지하고 사용자 이름에서 "빌드"할 수 있습니까?

감사합니다.

답변

1

를 작성해야 이벤트 리스너를. 코드 문서에서 :

/** 
* The REGISTRATION_INITIALIZE event occurs when the registration process is initialized. 
* 
* This event allows you to modify the default values of the user before binding the form. 
* The event listener method receives a FOS\UserBundle\Event\UserEvent instance. 
*/ 
const REGISTRATION_INITIALIZE = 'fos_user.registration.initialize'; 

이벤트 디스패처에 대한 정보를 더 : http://symfony.com/doc/current/components/event_dispatcher/introduction.html이 그리고 예를 들어 이벤트 리스너 : http://symfony.com/doc/current/cookbook/service_container/event_listener.html

UPDATE - 어떻게 코드를? 당신의 config.yml에서

(xml 같은 또는 services.yml 또는 기타 확장, php)이 같은 서비스를 정의 :

demo_bundle.listener.user_registration: 
    class:  Acme\DemoBundle\EventListener\Registration 
    tags: 
     - { name: kernel.event_listener, event: fos_user.registration.initialize, method: overrideUserEmail } 

다음, 정의 리스너 클래스 :

namespace Acme\DemoBundle\EventListener; 

class Registration 
{ 
    protected function overrideUserEmail(UserEvent $args) 
    { 
     $request = $args->getRequest(); 
     $formFields = $request->get('fos_user_registration_form'); 
     // here you can define specific email, ex: 
     $email = $formFields['username'] . '@sth.com'; 
     $formFields['email'] = $email; 
     $request->request->set('fos_user_registration_form', $formFields); 
    } 
} 

공지 사항 : 물론 당신이 할 수있는 수신기에 @validator을 삽입하여이 이메일의 유효성을 확인하십시오.

이제 등록 양식에 email 필드를 숨겨야합니다. 당신은 register_content.html.twig를 오버라이드 (override) 또는로 (내 oppinion 더 좋은 방법으로)이 같은 FOS RegistrationFormType를 오버라이드 (override)하는 것을 수행 할 수 있습니다

namespace Acme\DemoBundle\Form\Type; 

use FOS\UserBundle\Form\Type\RegistrationFormType as BaseType; 
use Symfony\Component\Form\FormBuilderInterface; 

class RegistrationFormType extends BaseType 
{ 
    // some code like __construct(), getName() etc. 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      // some code for your form builder 
      ->add('email', 'hidden', array('label' => 'form.email', 'translation_domain' => 'FOSUserBundle')) 
     ; 
    } 
} 

지금 응용 프로그램을 수동으로 이메일을 설정하기위한 준비가

.

+0

그가 동일한 양식을 사용하는 한 유효성 검사는 항상 실패합니다. – ferdynator

+1

@ byf-ferdy 'How to code?'를 추가했습니다. – NHG

3

주위에 간단한 방법이있다 (영어 죄송합니다, 나는 ... 완벽하지 알고). 심지어 mentioned in the official FOSUserBundle documentation입니다. 컨트롤러를 무시하면됩니다.

자신 번들을 만들고 연장 FOSUserBundle을 :

class CustomUserBundle extends Bundle 
{ 
    public function getParent() 
    { 
     return 'FOSUserBundle'; 
    } 
} 

을 그리고 다음 RegistrationController 오버라이드 (override) : fos_user.registration.initialize에 대한

class RegistrationController extends BaseController 
{ 
    public function registerAction(Request $request) 
    { 
     // here you can implement your own logic. something like this: 
     $user = new User(); 
     $form = $this->container->get('form.factory')->create(new RegistrationType(), $user); 
     if ($request->getMethod() == 'POST') { 
      $form->bind($request); 
      if ($form->isValid()) { 
       $user->setEmail($user->getUsername() . '@' . $user->getSchoolname() . '.fr'); 
       // and what not. Also don't forget to either activate the user or send an activation email 

      } 
     } 
    } 
} 
+0

글쎄 그것은 훌륭한 솔루션이지만, 한 필드를 관리하기에는 너무 많은 것이 아닌가? – user2654454

+0

다른 방법이 있습니다. 그러나 이것은 IMHO 가장 깨끗한 방법입니다. 나중에이 필드를 수정하거나 새 필드를 추가하거나 제거하려는 경우이 솔루션을 쉽게 확장 할 수 있습니다. – ferdynator