Symfony2 ORM prePersist不工作 [英] Symfony2 ORM prePersist Not Working
本文介绍了Symfony2 ORM prePersist不工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我的实体的prePersist()方法未被调用。
<?php
namespace Acme\DemoBundle\Entity;
使用Doctrine\ORM\Mapping作为ORM;
/ **
*用户
*
* @ ORM\Table(name =users)
* @ ORM\Entity
* @ ORM\HasLifecycleCallbacks()
* /
类用户
{
/ **
* @var字符串
*
* @ ORM \Column(name =username,type =string,length = 255,nullable = false)
* /
private $ username;
/ **
* @var string
*
* @ ORM\Column(name =firstname,type =string,length = 255 ,nullable = false)
* /
private $ firstname;
/ **
* @var string
*
* @ ORM\Column(name =lastname,type =string,length = 255 ,nullable = false)
* /
private $ lastname;
/ **
* @var string
*
* @ ORM\Column(name =email,type =string,length = 255 ,nullable = false)
* /
private $ email;
/ **
* @var string
*
* @ ORM\Column(name =password,type =string,length = 32 ,nullable = false)
* /
private $ password;
/ **
* @var boolean
*
* @ ORM\Column(name =active,type =boolean,nullable = false )
* /
private $ active;
/ **
* @var \DateTime
*
* @ ORM\Column(name =created,type =datetime = false)
* /
private $ created;
/ **
* @var \DateTime
*
* @ ORM\Column(name =modified,type =datetime = false)
* /
private $ modified;
/ **
* @var整数
*
* @ ORM\Column(name =id,type =integer)
* @ ORM\Id
* @ ORM\GeneratedValue(strategy =IDENTITY)
* /
private $ id;
/ **
*设置用户名
*
* @param string $ username
* @return Users
* /
public function setUsername($ username)
{
$ this-> username = $ username;
return $ this;
}
/ **
*获取用户名
*
* @return string
* /
public function getUsername )
{
return $ this-> username;
}
/ **
*设置第一个名称
*
* @param string $ firstname
* @return用户
* /
public function setFirstname($ firstname)
{
$ this-> firstname = $ firstname;
return $ this;
}
/ **
*获取名字
*
* @return string
* /
public function getFirstname )
{
return $ this-> firstname;
}
/ **
*设置lastname
*
* @param字符串$ lastname
* @return用户
* /
public function setLastname($ lastname)
{
$ this-> lastname = $ lastname;
return $ this;
}
/ **
*获取姓氏
*
* @return string
* /
public function getLastname )
{
return $ it-> lastname;
}
/ **
*设置电子邮件
*
* @param string $ email
* @return用户
* /
public function setEmail($ email)
{
$ this-> email = $ email;
return $ this;
}
/ **
*获取电子邮件
*
* @return string
* /
public function getEmail )
{
return $ this-> email;
}
/ **
*设置密码
*
* @param string $ password
* @return用户
* /
public function setPassword($ password)
{
$ this-> password = $ password;
return $ this;
}
/ **
*获取密码
*
* @return string
* /
public function getPassword )
{
return $ this-> password;
}
/ **
*设置活动
*
* @ ORM\PrePersist
* @param boolean $ active
* @return Users
* /
public function setActive($ active)
{
$ this-> active = $ active;
return $ this;
}
/ **
*获取活动
*
* @return boolean
* /
public function getActive )
{
return $ this-> active;
}
/ **
*创建的集
*
* @param \DateTime $ created
* @return用户
* /
public function setCreated()
{
$ this-> created = $ created;
return $ this;
}
/ **
*创建
*
* @return \DateTime
* /
公共函数getCreated()
{
return $ this-> created;
}
/ **
*设置修改
*
* @param \DateTime $ modified
* @return用户
* /
public function setModified()
{
$ this-> modified = $ modified;
return $ this;
}
/ **
*获得修改
*
* @return \DateTime
* /
public function getModified()
{
return $ this-> modified;
}
/ **
*获取id
*
* @return整数
* /
public function getId )
{
return $ this-> id;
}
/ **
* @ ORM\PrePersist
* @ ORM\PreUpdate
* /
public function prePersist ){
$ this-> active = 0;
$ this-> created = date('Y-m-d H:i:s');
$ this-> modified = date('Y-m-d H:i:s');
}
}
这里是我的代码Form / UsersType.php
<?php
namespace Acme\DemoBundle\Form;
使用Symfony \Component\Form\AbstractType;
使用Symfony \Component\Form\FormBuilderInterface;
使用Symfony \Component\OptionsResolver\OptionsResolverInterface;
class UsersType extends AbstractType
{
public function buildForm(FormBuilderInterface $ builder,array $ options)
{
$ builder
- > add('username','text',array('required'=> true))
- > add('firstname','text',array('required'=> ; true))
- > add('lastname','text',array('required'=> true))
- > add('email','email',array ('label'=>'E-Mail'))
- > add('password','password',array('label'=>'Password'))
- > ; add('password_confirmation','password',array('mapped'=> false))//在表单上添加虚拟字段
/ *
- ',array('data'=>''))
- > add('created','hidden',array('data'=>''))
- > add('modified','hidden',array('data'=>''))
*
* /
;
}
public function setDefaultOptions(OptionsResolverInterface $ resolver)
{
$ resolver-> setDefaults(array(
'data_class'=& Acme\DemoBundle\Entity\Users'
));
}
public function getName()
{
return'acme_demobundle_userstype';
}
}
我已将这三个字段注释掉,修改为不以表单形式显示。
但我收到错误:
执行'INSERT INTO用户(用户名,名,姓,电子邮件,密码,活动,创建,修改)VALUES(?,?,?,?,?,?,? params [neeraj,neeraj,kumar,neeraj.kumar@test.com,p @ ssw0rd,null,null,null]:
pre>
我在实体中缺少什么?
堆栈跟踪 p>
堆栈跟踪(纯文本) -
[1] Doctrine\ DBAL\DBALException:发生在执行'INSERT INTO用户(用户名,名字,姓氏,电子邮件,密码,活动,创建,修改)VALUES(?,?,?,?,?,?,?,?)'与params [neeraj neeraj,kumar,neeraj.kumar@rsystems.com,p @ ssw0rd,null,null,null]:
SQLSTATE [23000]:Integrity约束违规:1048 'active'不能为空
at n / a
在C:\wamp\www\Symfony\vendor\doctrine\dbal\lib\Doctrine\DBAL\ DBALException.php line 47
at Doctrine\DBAL\DBALException :: driverExceptionDuringQuery(object(PDOException),'INSERT INTO users(username,firstname,lastname,email,password,active,created,modified )VALUES(?,?,?,?,?,?,?,?)',array('neeraj','neeraj','kumar','neeraj.kumar@rsystems.com','p @ ssw0rd' ,null,null,null))
在C:\wamp\www\Symfony\vendor\doctrine\dbal\lib\Doctrine\DBAL\Statement.php行140
at Doctrine\DBAL\Statement-> execute()
在C:\wamp\www\Symfony\vendor\doctrine\orm\lib\\ \\Doctrine\ORM\Persisters\BasicEntityPersister.php line 277
at Doctrine\ORM\Persisters\BasicEntityPersister-> executeInserts()
在C:\wamp \www\Symfony\vendor\doctrine\orm/\\lib\Doctrine\ORM\UnitOfWork.php line 929
at Doctrine\ORM\UnitOfWork-> executeInserts(object(ClassMetadata))
在C:\wamp\www\Symfony\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php第318行
at Doctrine\ORM\UnitOfWork-> commit(null)
在C:\wamp\www\Symfony\vendor\doctrine\orm\lib\\ \\Doctrine\ORM\EntityManager.php line 355
at Doctrine\ORM\EntityManager-> flush()
在C:\wamp\www\Symfony \src\Acme\DemoBundle\Controller\UsersController.php line 55
在Acme\DemoBundle\Controller\UsersController-> createAction(object(Request))
在行
在call_user_func_array(array(object(UsersController),'createAction'),array(object(Request)))
在C:\wamp\www\ Symfony \app\bootstrap.php.bache line 2774
在Symfony \Component\HttpKernel\HttpKernel-> handleRaw(object(Request),'1')
在C:\wamp\www\Symfony\app\bootstrap.php.bache行2748
在Symfony \Component\HttpKernel\HttpKernel-> handle(object(请求),'1',true)
在C:\wamp\www\Symfony\app\bootstrap.php.cache第2878行
在Symfony \Component \HttpKernel\DependencyInjection\ContainerAwareHttpKernel-> handle(object(Request),'1',true)
在C:\wamp\www\Symfony\app\bootstrap.php。缓存线2179
在Symfony \Component\HttpKernel\Kernel->句柄(对象(请求))
在C:\wamp\www\Symfony\ web\app_dev.php line 28
[2] PDOException:SQLSTATE [23000]:完整性约束违例:1048列'active'不能为null
at n / a
in C:\wamp\www\Symfony\vendor\doctrine\dbal\lib\Doctrine\DBAL\Statement.php line 138
at PDOStatement->执行(null)
在C:\wamp\www\Symfony\vendor\doctrine\dbal\lib\Doctrine\DBAL\Statement.php行138
at Doctrine\DBAL\Statement-> execute()
在C:\wamp\www\Symfony\vendor\doctrine\orm\lib\Doctrine\ ORM \Persisters\BasicEntityPersister.php line 277
at Doctrine\ORM\Persisters\BasicEntityPersister-> executeInserts()
在C:\wamp\www\\ \\ Symfony \vendor\doctrine\vendor\doctrine\orm/\\lib\Doctrine\ORM\UnitOfWork.php line 929
at Doctrine\ORM\UnitOfWork-> executeInserts(object( ClassMetadata))
在C:\wamp\www\Symfony\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php第318行
at Doctrine\ORM\UnitOfWork-> commit(null)
在C:\wamp\www\Symfony\vendor\doctrine\orm\lib\Doctrine\ ORM\EntityManager.php line 355
at Doctrine\ORM\EntityManager-> flush()
在C:\wamp\www\Symfony\src\\ \\ Acme \DemoBundle\Controller\UsersController.php line 55
在Acme\DemoBundle\Controller\UsersController-> createAction(object(Request))
在行
在call_user_func_array(array(object(UsersController),'createAction'),array(object(Request)))
在C:\wamp\www\Symfony\app \bootstrap.php.bache line 2774
在Symfony \Component\HttpKernel\HttpKernel-> handleRaw(object(Request),'1')
在C: \\ wamp\www\Symfony\app\Symfony\app\bootstrap.php.bache line 2748
在Symfony \Component\HttpKernel\HttpKernel->句柄(对象(请求),' 1',true)
在C:\wamp\www\Symfony\app\bootstrap.php.cache第2878行
在Symfony \Component\HttpKernel\\ \\ DependencyInjection\ContainerAwareHttpKernel-> handle(object(Request),'1',true)
在C:\wamp\www\Symfony\app\bootstrap.php.cache行2179
在Symfony \Component\HttpKernel\Kernel-> handle(object(Request))
在C:\wamp\www\Symfony\web\app_dev .php line 28
解决方案根据文档,您必须启用生命周期回调 http://symfony.com/doc/current/book/doctrine.html
/ **
* @ ORM\Entity()
* @ ORM\\ \\ HasLifecycleCallbacks()
* /
class Product
{
// ...
}
prePersist() method of my entity is not being invoked.
<?php namespace Acme\DemoBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * Users * * @ORM\Table(name="users") * @ORM\Entity * @ORM\HasLifecycleCallbacks() */ class Users { /** * @var string * * @ORM\Column(name="username", type="string", length=255, nullable=false) */ private $username; /** * @var string * * @ORM\Column(name="firstname", type="string", length=255, nullable=false) */ private $firstname; /** * @var string * * @ORM\Column(name="lastname", type="string", length=255, nullable=false) */ private $lastname; /** * @var string * * @ORM\Column(name="email", type="string", length=255, nullable=false) */ private $email; /** * @var string * * @ORM\Column(name="password", type="string", length=32, nullable=false) */ private $password; /** * @var boolean * * @ORM\Column(name="active", type="boolean", nullable=false) */ private $active; /** * @var \DateTime * * @ORM\Column(name="created", type="datetime", nullable=false) */ private $created; /** * @var \DateTime * * @ORM\Column(name="modified", type="datetime", nullable=false) */ private $modified; /** * @var integer * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="IDENTITY") */ private $id; /** * Set username * * @param string $username * @return Users */ public function setUsername($username) { $this->username = $username; return $this; } /** * Get username * * @return string */ public function getUsername() { return $this->username; } /** * Set firstname * * @param string $firstname * @return Users */ public function setFirstname($firstname) { $this->firstname = $firstname; return $this; } /** * Get firstname * * @return string */ public function getFirstname() { return $this->firstname; } /** * Set lastname * * @param string $lastname * @return Users */ public function setLastname($lastname) { $this->lastname = $lastname; return $this; } /** * Get lastname * * @return string */ public function getLastname() { return $this->lastname; } /** * Set email * * @param string $email * @return Users */ public function setEmail($email) { $this->email = $email; return $this; } /** * Get email * * @return string */ public function getEmail() { return $this->email; } /** * Set password * * @param string $password * @return Users */ public function setPassword($password) { $this->password = $password; return $this; } /** * Get password * * @return string */ public function getPassword() { return $this->password; } /** * Set active * * @ORM\PrePersist * @param boolean $active * @return Users */ public function setActive($active) { $this->active = $active; return $this; } /** * Get active * * @return boolean */ public function getActive() { return $this->active; } /** * Set created * * @param \DateTime $created * @return Users */ public function setCreated() { $this->created = $created; return $this; } /** * Get created * * @return \DateTime */ public function getCreated() { return $this->created; } /** * Set modified * * @param \DateTime $modified * @return Users */ public function setModified() { $this->modified = $modified; return $this; } /** * Get modified * * @return \DateTime */ public function getModified() { return $this->modified; } /** * Get id * * @return integer */ public function getId() { return $this->id; } /** * @ORM\PrePersist * @ORM\PreUpdate */ public function prePersist(){ $this->active = 0; $this->created = date('Y-m-d H:i:s'); $this->modified = date('Y-m-d H:i:s'); } }
Here is my code of Form/UsersType.php
<?php namespace Acme\DemoBundle\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolverInterface; class UsersType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('username','text', array('required' => true)) ->add('firstname','text', array('required' => true)) ->add('lastname','text', array('required' => true)) ->add('email', 'email', array('label' => 'E-Mail')) ->add('password', 'password', array('label' => 'Password')) ->add('password_confirmation', 'password', array('mapped' => false)) // Added virtual field on form /* ->add('active','hidden',array('data' => '')) ->add('created','hidden',array('data' => '')) ->add('modified','hidden',array('data' => '')) * */ ; } public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'Acme\DemoBundle\Entity\Users' )); } public function getName() { return 'acme_demobundle_userstype'; } }
I have commented out these three fields active, created and modified to not display them in the form.
But i am getting error:
An exception occurred while executing 'INSERT INTO users (username, firstname, lastname, email, password, active, created, modified) VALUES (?, ?, ?, ?, ?, ?, ?, ?)' with params ["neeraj", "neeraj", "kumar", "neeraj.kumar@test.com", "p@ssw0rd", null, null, null]:
What i am missing in the Entity?
Stack Trace
Stack Trace (Plain Text) - [1] Doctrine\DBAL\DBALException: An exception occurred while executing 'INSERT INTO users (username, firstname, lastname, email, password, active, created, modified) VALUES (?, ?, ?, ?, ?, ?, ?, ?)' with params ["neeraj", "neeraj", "kumar", "neeraj.kumar@rsystems.com", "p@ssw0rd", null, null, null]: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'active' cannot be null at n/a in C:\wamp\www\Symfony\vendor\doctrine\dbal\lib\Doctrine\DBAL\DBALException.php line 47 at Doctrine\DBAL\DBALException::driverExceptionDuringQuery(object(PDOException), 'INSERT INTO users (username, firstname, lastname, email, password, active, created, modified) VALUES (?, ?, ?, ?, ?, ?, ?, ?)', array('neeraj', 'neeraj', 'kumar', 'neeraj.kumar@rsystems.com', 'p@ssw0rd', null, null, null)) in C:\wamp\www\Symfony\vendor\doctrine\dbal\lib\Doctrine\DBAL\Statement.php line 140 at Doctrine\DBAL\Statement->execute() in C:\wamp\www\Symfony\vendor\doctrine\orm\lib\Doctrine\ORM\Persisters\BasicEntityPersister.php line 277 at Doctrine\ORM\Persisters\BasicEntityPersister->executeInserts() in C:\wamp\www\Symfony\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php line 929 at Doctrine\ORM\UnitOfWork->executeInserts(object(ClassMetadata)) in C:\wamp\www\Symfony\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php line 318 at Doctrine\ORM\UnitOfWork->commit(null) in C:\wamp\www\Symfony\vendor\doctrine\orm\lib\Doctrine\ORM\EntityManager.php line 355 at Doctrine\ORM\EntityManager->flush() in C:\wamp\www\Symfony\src\Acme\DemoBundle\Controller\UsersController.php line 55 at Acme\DemoBundle\Controller\UsersController->createAction(object(Request)) in line at call_user_func_array(array(object(UsersController), 'createAction'), array(object(Request))) in C:\wamp\www\Symfony\app\bootstrap.php.cache line 2774 at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), '1') in C:\wamp\www\Symfony\app\bootstrap.php.cache line 2748 at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), '1', true) in C:\wamp\www\Symfony\app\bootstrap.php.cache line 2878 at Symfony\Component\HttpKernel\DependencyInjection\ContainerAwareHttpKernel->handle(object(Request), '1', true) in C:\wamp\www\Symfony\app\bootstrap.php.cache line 2179 at Symfony\Component\HttpKernel\Kernel->handle(object(Request)) in C:\wamp\www\Symfony\web\app_dev.php line 28 [2] PDOException: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'active' cannot be null at n/a in C:\wamp\www\Symfony\vendor\doctrine\dbal\lib\Doctrine\DBAL\Statement.php line 138 at PDOStatement->execute(null) in C:\wamp\www\Symfony\vendor\doctrine\dbal\lib\Doctrine\DBAL\Statement.php line 138 at Doctrine\DBAL\Statement->execute() in C:\wamp\www\Symfony\vendor\doctrine\orm\lib\Doctrine\ORM\Persisters\BasicEntityPersister.php line 277 at Doctrine\ORM\Persisters\BasicEntityPersister->executeInserts() in C:\wamp\www\Symfony\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php line 929 at Doctrine\ORM\UnitOfWork->executeInserts(object(ClassMetadata)) in C:\wamp\www\Symfony\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php line 318 at Doctrine\ORM\UnitOfWork->commit(null) in C:\wamp\www\Symfony\vendor\doctrine\orm\lib\Doctrine\ORM\EntityManager.php line 355 at Doctrine\ORM\EntityManager->flush() in C:\wamp\www\Symfony\src\Acme\DemoBundle\Controller\UsersController.php line 55 at Acme\DemoBundle\Controller\UsersController->createAction(object(Request)) in line at call_user_func_array(array(object(UsersController), 'createAction'), array(object(Request))) in C:\wamp\www\Symfony\app\bootstrap.php.cache line 2774 at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), '1') in C:\wamp\www\Symfony\app\bootstrap.php.cache line 2748 at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), '1', true) in C:\wamp\www\Symfony\app\bootstrap.php.cache line 2878 at Symfony\Component\HttpKernel\DependencyInjection\ContainerAwareHttpKernel->handle(object(Request), '1', true) in C:\wamp\www\Symfony\app\bootstrap.php.cache line 2179 at Symfony\Component\HttpKernel\Kernel->handle(object(Request)) in C:\wamp\www\Symfony\web\app_dev.php line 28
解决方案I have the same problem. According to docs you must enable lifecycle callbacks http://symfony.com/doc/current/book/doctrine.html
/** * @ORM\Entity() * @ORM\HasLifecycleCallbacks() */ class Product { // ... }
这篇关于Symfony2 ORM prePersist不工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文