Symfony 3.0:我如何知道何时成功插入一个条目?

时间:2016-02-20 11:03:10

标签: php doctrine symfony

我在Symfony 3.0项目中创建了一个用户实体:

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;


/**
 * @ORM\Entity
 * @ORM\Table(name="users")
 * @ORM\Entity(repositoryClass="AppBundle\Entity\UserRepository")
 */
class Users
{
  /**
   * @ORM\Column(type="string", length=60)
   * @ORM\Id
   * @ORM\GeneratedValue(strategy="CUSTOM")
   * @ORM\CustomIdGenerator(class="AppBundle\Doctrine\AutoIdGenerate")
   */
  private $id;

  /**
   * @ORM\Column(type="string", length=15)
   */
  private $username;

  /**
   * @ORM\Column(type="string", length=30)
   */
  private $password;

  /**
   * @ORM\Column(type="string", length=60)
   * @ORM\GeneratedValue(strategy="CUSTOM")
   * @ORM\CustomIdGenerator(class="AppBundle\Doctrine\AutoIdGenerate")
   */
  private $token;

  /**
   * @ORM\Column(type="boolean")
   */
  private $activated;

    /**
     * Get id
     *
     * @return string
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set username
     *
     * @param string $username
     *
     * @return Users
     */
    public function setUsername($username)
    {
        $this->username = strip_tags($username);

        return $this;
    }

    /**
     * Get username
     *
     * @return string
     */
    public function getUsername()
    {
        return $this->username;
    }

    /**
     * Set password
     *
     * @param string $password
     *
     * @return Users
     */
    public function setPassword($password)
    {
      $options = ['cost' => 42];
      $this->password = password_hash ($password,CRYPT_BLOWFISH,$options);

      return $this;
    }

    /**
     * Get password
     *
     * @return string
     */
    public function getPassword()
    {
        return $this->password;
    }

    /**
     * Set token
     *
     * @param string $token
     *
     * @return Users
     */
    public function setToken($token)
    {
        $this->token = $token;

        return $this;
    }

    /**
     * Get token
     *
     * @return string
     */
    public function getToken()
    {
        return $this->token;
    }

    /**
     * Set activated
     *
     * @param boolean $activated
     *
     * @return Users
     */
    public function setActivated($activated)
    {
        $this->activated = $activated;

        return $this;
    }

    /**
     * Get activated
     *
     * @return boolean
     */
    public function getActivated()
    {
        return $this->activated;
    }

}

一个满足我逻辑的存储库:

<?php
namespace AppBundle\Entity;

use AppBundle\Entity\Product;
use Doctrine\ORM\EntityRepository;

class UserRepository extends EntityRepository
{
  public function register($username,$password,$email)
  {
    //A Generic return Object
    $status=array('status'=>'true','data'=>"");

    if(empty($username))
    {
      $status['status']=-1;
      $status['data']='Username not given';
      return $status;
    }

    if(empty($password))
    {
      $status['status']=-1;
      $status['data']='Password not given';
      return $status;
    }

    if(empty($email))
    {
      $status['status']=-1;
      $status['data']='Email not given';
      return $status;
    }


    $user=new User();
    $user->setUsername($username)->setPassword($password);

    $em=$this->getEntityManager();

    $em->persist($user);
    $em->flush();

    return $status;
  }

}

我想知道的是,当一个条目成功插入以发送电子邮件以验证注册时。我将如何知道用户已成功插入数据库;另外,我将如何使用任何类型的自动生成字段(如id和令牌)来验证邮件地址。

我发现为了使用电子邮件我可以使用Swiftmailer所以问题 是不是发送电子邮件,但我将如何知道用户已成功插入。

2 个答案:

答案 0 :(得分:1)

如果您的输入被正确插入,您将不会有任何错误 否则,您将拥有一个(除非您有错误不是来自插入)。

要捕获可能的错误,您可以执行以下操作:

// ...
$em->persist($user);
try {
    $em->flush();
     // Success 
} catch (\Exception $e) {
    $result['data'] = $e->getMessage(); // The exact message of the exception thrown during INSERT
    // Error
}

否则,您可以认为该条目已存储。

对于自动生成的字段,在调用$em->flush()后,它们会立即通过getter获取。

答案 1 :(得分:1)

您可以为Doctrine postFlush事件注册事件监听器。

示例监听器:

<?php
use Doctrine\ORM\Event\PostFlushEventArgs;

class PostFlushExampleListener
{
    public function postFlush(PostFlushEventArgs $args)
    {
        // ...
    }
}

Symfony中的服务注册:

services:
    my.listener:
        class: PostFlushExampleListener
        tags:
            - { name: doctrine.event_listener, event: postFlush }

Symfony文档:http://symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.html

学说文档:http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/events.html#listening-and-subscribing-to-lifecycle-events

您应该在调用flush操作后调用所有自动生成的字段。在您的情况下,学说事件不是强制性的。我只是假设在刷新后我将拥有所有需要的数据,数据将在数据库中设置。