Symfony2 ORM prePersist不工作 [英] Symfony2 ORM prePersist Not Working

查看:155
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆