我现在的解决方案
用户类
<?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);
}
}
post persist 事件监听器
<?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();
}
}
}
app/config/service.yml
fmarketUserPostPersistListner:
class: FM\FmBundle\EventListener\UserPostPersistListener
tags:
- { name: doctrine.event_listener, event: postPersist }
app/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);
很好用
我在 if 之前尝试过这个
dump(get_class($user));
dump($user instanceof Users); die;
它给了
UserPostPersistListener.php on line 17:
"FM\FmBundle\Entity\Users"
UserPostPersistListener.php on line 18:
false
我的问题是为什么$user 的类名是Users 而不是Users 的实例?
如果没有 if 语句,将为每个实体执行代码