2015-08-19 3 views
0

в моем проекте Symfony У меня есть различные типы пользователей: 2 администратора учетных записи с идентификаторами 1 и 2 и именем пользователя может быть любым 100 счета для компании с идентификаторами 3-102 и имени пользователя должен быть AA001 до AA100 и учетные записи для обычных пользователей с именем пользователя AA101, AA102, ...Symfony2 FOSUserBundle генерировать буквенно-цифровой логин

две учетные записи администратора и учетные записи компании Я создам команду symfony для их создания.

мой вопрос заключается в том, чтобы создать имя пользователя для тех, кто будет использовать регистрационную форму так, чтобы первый, кто зарегистрирует его имя пользователя является AA101 и так далее

моя первая мысль: восстановить ID макс (maxid) и использовать ($ имя пользователя = «AA'.maxid-1) но что произойдет, если два пользователя зарегистрироваться в то же время

вторая идея: сохраняться объект и получить его идентификатор (afterpersist событий) и использовать ($ имя пользователя = 'AA'.id-2) Этот метод позволяет избежать риска иметь одно и то же имя пользователя для обоих учетных записей , но что поставить имя пользователя до его сохранения

Я не знаю, с чего начать, а какой метод лучше. поэтому любой совет или любая идея будет очень полезно

PS: извините за мой английский

+0

Фактически вторая идея выглядит лучше, чем первая, по умолчанию вы можете установить имя пользователя для некоторого значения по умолчанию, а затем оно будет изменено. – nowiko

ответ

0

моего решения на текущий

классом пользователя

<?php 
namespace FM\FmBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use FOS\UserBundle\Model\User as BaseUser; 

/** 
* @ORM\Entity 
* @ORM\Table(name="fos_user") 
*/ 
class Users extends BaseUser 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    public function __construct() 
    { 
     parent::__construct(); 
     // your own logic 
    } 

    public function setEmail($email){ 
     parent::setEmail($email); 
     parent::setUsername($email); 
    } 
} 

поста сохраняется событие слушатель

<?php 
namespace FM\FmBundle\EventListener; 
use Doctrine\ORM\Event\LifecycleEventArgs; 
use Doctrine\ORM\Event\PostFlushEventArgs; 

class UserPostPersistListener 
{ 
    private $needsFlush; 
    public function __construct(){ 
     $this->needsFlush=false; 
    } 

    public function postPersist(LifecycleEventArgs $args) 
    { 
     $user = $args->getEntity(); 
     $em = $args->getEntityManager(); 
     if($user instanceof Users) { 
      $number=$user->getId()-2; 
      $user->setUsername('AA'.$number); 
     } 

     $em->persist($user); 
     $this->needsFlush = true; 
    } 

    public function postFlush(PostFlushEventArgs $eventArgs) 
    { 
     if ($this->needsFlush) { 
      $this->needsFlush = false; 
      $eventArgs->getEntityManager()->flush(); 
     } 
    } 
} 

приложение/config/service.yml

fmarketUserPostPersistListner: 
     class: FM\FmBundle\EventListener\UserPostPersistListener 
     tags: 
      - { name: doctrine.event_listener, event: postPersist } 

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

providers: 
     fos_userbundle: 
      id: fos_user.user_provider.username_email 

но никакая вещь не случится имя пользователя, по-прежнему такой же, как адреса электронной почты пользователя, , когда я заменить

if($user instanceof Users) { 
      $number=$user->getId()-2; 
      $user->setUsername('AA'.$number); 
     } 

по

$number=$user->getId()-2; 
$user->setUsername('AA'.$number); 

it work штраф

Я попытался это перед, если

dump(get_class($user)); 
dump($user instanceof Users); die; 

это дает

UserPostPersistListener.php on line 17: 
"FM\FmBundle\Entity\Users" 
UserPostPersistListener.php on line 18: 
false 

мой вопрос, почему имя класса $ пользователь Пользователи, но его не экземпляр пользователей? и без оператора if код будет выполнен для каждого объекта

+0

функция php is_a ($ user , «Пользователи») дают false is_a ($ user, 'FM \ FmBundle \ Entity \ Users') дают true, поэтому я могу использовать оператор if – neoman

Смежные вопросы