2013-09-10 1 views
1

На моем сайте аутентификация выполняется с помощью мобильного телефона. Телефон состоит из двух частей: кода и номера («+7 (код)»). Это реализуется с помощью унаследованного типа поля формы:Как использовать нестандартное имя пользователя для аутентификации в Symfony2

PhoneType.php

class PhoneType extends TextType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('code', 'text')->add('number', 'text') 
      ->addModelTransformer(new PhoneToStringTransformer()); 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array('compound' => true)); 
    } 
} 

PhoneToStringTransformer.php

class PhoneToStringTransformer implements DataTransformerInterface 
{ 
    public function transform($string) 
    { 
     if (!empty($string) && !preg_match('/^\+7\d{10}$/', $string)) { 
      throw new TransformationFailedException('Incorrect phone format'); 
     } 
     return array(
      'code' => substr($string, 2, 3), 
      'number' => substr($string, 5)); 
    } 

    public function reverseTransform($phone) 
    { 
     return sprintf('+7%s%s', $phone['code'], $phone['number']); 
    } 
} 

Но когда я пытаюсь проверить подлинность, у меня есть это предупреждение:

Предупреждение: tr им() ожидает параметр 1, чтобы быть строка, массив приведен в \ путь \ к \ Проект \ поставщика \ Symfony \ Symfony \ SRC \ Symfony \ Component \ Security \ Http \ Firewall \ UsernamePasswordFormAuthenticationListener.php линии 79

Предупреждение происходит потому, что для этого требуется имя пользователя в виде строки, но возвращаемое значение формы входа - это массив.
Как сделать аутентификацию с нестандартным «именем пользователя» (мой телефон как массив)?
Я использую стандартный SecurityBundle.

приложение/Config/security.yml

providers: 
    main: 
     entity: { class: MyProject:User, property: phone } 

firewalls: 
    main: 
     form_login: 
      username_parameter: userForm[phone] 

Я не знаю, как указать username_parameter, чтобы он перешел к UsernamePasswordFormAuthenticationListener в виде строки userForm[phone][code] + userForm[phone][number].

ответ

1

Убедитесь, что ваш yml-файл имеет правильный отступ. Этот формат, который вы используете userForm[phone], должен работать, так как у меня была аналогичная проблема, выписав такие параметры.

Symfony2, forms, username_parameter and firewall parameters