我在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所以问题 是不是发送电子邮件,但我将如何知道用户已成功插入。
答案 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
您应该在调用flush
操作后调用所有自动生成的字段。在您的情况下,学说事件不是强制性的。我只是假设在刷新后我将拥有所有需要的数据,数据将在数据库中设置。