当用户注册新帐户时,在单独的 table 中创建记录

Create records in separate table when user registers new account

我正在用 Symfony2 创建一个 WebBrowser 游戏。我想要实现的是: 我有一个 table 用户。当新用户在游戏中注册时,新记录添加到 table fos_user。当新用户注册时我也想把记录放在 table 存储游戏中用户资源的起始数量。

我已阅读有关事件侦听器的信息,但我不确定它们是否是解决我问题的最佳方法。

这是持有用户的实体,material类型及其数量

/**
 * @var int
 *
 * @ORM\Column(name="quantity", type="bigint")
 */
private $quantity;





/*
 * connection material->MaterialStock<-User
 */

/**
 *@ORM\ManyToOne(targetEntity="Material", inversedBy="userMaterial") 
 * 
 */
private $material;


/**
 *
 * @ORM\ManyToOne(targetEntity="User", inversedBy="userMaterial") 
 */
private $user;


function getId() {
    return $this->id;
}
function getQuantity() {
    return $this->quantity;
}
function getMaterial() {
    return $this->material;
}
function getUser() {
    return $this->user;
}
function setQuantity($quantity) {
    $this->quantity = $quantity;
}
function setMaterial($material) {
    $this->material = $material;
}
function setUser($user) {
    $this->user = $user;
}
}

用户实体如下所示

<?php
// src/AppBundle/Entity/User.php
namespace FactoryBundle\Entity;
use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
use FactoryBundle\Entity\Factory;
use Doctrine\Common\Collections\ArrayCollection;
/**
* @ORM\Entity
* @ORM\Table(name="fos_user")
*/
class User extends BaseUser
{
/**
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 * 
 */
protected $id;


public function __construct()
{
    parent::__construct();
    $this->productionOrders = new ArrayCollection();


}

/**
 * @ORM\OneToOne(targetEntity="Factory", mappedBy="user")
 */

private $factory;





/*
 * connecting User->materialStock<-Material
 */
/**
 *
 *  @ORM\OneToMany(targetEntity="MaterialStock", mappedBy="user") 
 */
private $userMaterial;



/**
 * @ORM\OneToMany(targetEntity="ProductionOrders", mappedBy="user")
 */
private $productionOrders;

/** @ORM\OneToMany(targetEntity="ToyStock", mappedBy="user") */
private $userToyStock;


function getId() {
    return $this->id;
}
function getFactory() {
    return $this->factory;
}
function getUserMaterial() {
    return $this->userMaterial;
}
function getProductionOrders() {
    return $this->productionOrders;
}
function getUserToyStock() {
    return $this->userToyStock;
}
function setId($id) {
    $this->id = $id;
}
function setFactory($factory) {
    $this->factory = $factory;
}
function setUserMaterial($userMaterial) {
    $this->userMaterial = $userMaterial;
}
function setProductionOrders($productionOrders) {
    $this->productionOrders = $productionOrders;
}
function setUserToyStock($userToyStock) {
    $this->userToyStock = $userToyStock;
} 
}

您可以使用事件订阅者。

<?php

namespace ...;

use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\FilterUserResponseEvent;
use Steora\Api\UserBundle\Entity\User;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use ...\EntityThatHoldsUserTypeOfMaterialAndQuantity;

/**
 * ...
 */
class RegistrationCompletionListener implements EventSubscriberInterface
{
    /** @var EntityManager */
    private $em;

    /**
     * @param EntityManager $em
     */
    public function __construct(EntityManager $em)
    {
        $this->em = $em;
    }

    /**
     * {@inheritdoc}
     */
    public static function getSubscribedEvents()
    {
        return array(
            FOSUserEvents::REGISTRATION_COMPLETED => 'onRegistrationCompletionSuccess',
        );
    }

    /**
     * @param FilterUserResponseEvent $event
     */
    public function onRegistrationCompletionSuccess(FilterUserResponseEvent $event)
    {
        // you can modify response here, but you can remove this line if there is no need to touch response...
        $response = $event->getResponse();

        $user = $event->getUser();

        $entityThatHoldsUserTypeOfMaterialAndQuantity = new EntityThatHoldsUserTypeOfMaterialAndQuantity();

        $entityThatHoldsUserTypeOfMaterialAndQuantity->setUser($user);
        $entityThatHoldsUserTypeOfMaterialAndQuantity->setQuantity(...);
        ...

        $this->em->persist($entityThatHoldsUserTypeOfMaterialAndQuantity);
        $this->em->flush();
    }
}

在 service.yml

中注册您的服务
services:
    ...
    steora.api.user.registration_confirmation:
        class: YourBundle\..\RegistrationCompletionListener
        arguments: ['@doctrine.orm.default_entity_manager']
        tags:
            - { name: kernel.event_subscriber }

因此,您正在监听某个事件,当该事件发生时,您会执行所需的操作:)

在这里你可以找到更多的活动,也许FOSUserEvents::REGISTRATION_COMPLETED以外的活动更适合你:https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/FOSUserEvents.php

这是官方文档中的示例:http://symfony.com/doc/current/bundles/FOSUserBundle/controller_events.html


这是工作流程:

1) 用户正在填写注册表并提交他的数据。

2) 如果表单有效,则会发生以下情况:

// friendsofsymfony/user-bundle/Controller/RegistrationController.php

if ($form->isSubmitted()) {
    if ($form->isValid()) {
        $event = new FormEvent($form, $request);
        $dispatcher->dispatch(FOSUserEvents::REGISTRATION_SUCCESS, $event);

        $userManager->updateUser($user);

        if (null === $response = $event->getResponse()) {
            $url = $this->generateUrl('fos_user_registration_confirmed');
            $response = new RedirectResponse($url);
        }

        // This is event you are listening for!!!!
        $dispatcher->dispatch(FOSUserEvents::REGISTRATION_COMPLETED, new FilterUserResponseEvent($user, $request, $response));

        return $response;
    }

    $event = new FormEvent($form, $request);
    $dispatcher->dispatch(FOSUserEvents::REGISTRATION_FAILURE, $event);

    if (null !== $response = $event->getResponse()) {
        return $response;
    }
}

3) 你的听众对事件做出反应,在 onRegistrationCompletionSuccess() 中你做你的事情,然后一切照常进行:)

马特科·迪帕洛 谢谢您的回答。如果我对你的理解正确的话,你的方法的工作流程是:

FOSUser:RegistrationController.php 注册完成后创建一个事件

$dispatcher->dispatch(FOSUserEvents::REGISTRATION_COMPLETED, new FilterUserResponseEvent($user, $request, $response));

在你的 class RegistrationCompletionListener 行中:

public static function getSubscribedEvents()
{
    return array(
        FOSUserEvents::REGISTRATION_COMPLETED => 'onRegistrationCompletionSuccess',
    );
}enter code here

我正在指定我希望我的应用也在线收听哪些事件:

public function onRegistrationCompletionSuccess(FilterUserResponseEvent $event)
{
    $response = $event->getResponse();
    //... make needed actions
    $this->yourDependencies->doSomeStufff()...
}

我可以告诉我脚本该事件发生时该怎么做。在我的例子中,获取用户对象并在数据库中为他创建记录。