На моем сайте аутентификация выполняется с помощью мобильного телефона. Телефон состоит из двух частей: кода и номера («+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]
.