【问题标题】:Symfony doctrine YAML mapping lifecycleCallbacks:prePersistSymfony 学说 YAML 映射生命周期回调:prePersist
【发布时间】:2014-08-05 09:45:11
【问题描述】:

所以我是 YAML 映射学说的新手,我对某些事情不确定。基本上我有以下 YAML 文件,我已经为你剥离了这些文件以及生成的实体文件。

YAML:

# src/ACME/Base/UserBundle/Resources/config/doctrine/User.orm.yml
ACME\UserBundle\Entity\User:
    table: fos_user
    type:  entity
    repositoryClass: ACME\UserBundle\Repository\User
    id:
        id:
            type: integer
            generator:
                strategy: AUTO
    fields:
        firstName:
            type: string
            length: 30
            column: first_name
            nullable: false
        lastName:
            type: string
            length: 50
            column: last_name
            nullable: false
        dateJoined:
            type: datetime
            column: date_joined
            nullable: false   

实体:

<?php

namespace ACME\UserBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * User
 */
class User
{
    /**
     * @var integer
     */
    private $id;

    /**
     * @var string
     */
    private $firstName;

    /**
     * @var string
     */
    private $lastName;

    /**
     * @var \DateTime
     */
    private $dateJoined;


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

    /**
     * Set firstName
     *
     * @param string $firstName
     * @return User
     */
    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 User
     */
    public function setLastName($lastName)
    {
        $this->lastName = $lastName;

        return $this;
    }

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

    /**
     * Set dateJoined
     *
     * @param \DateTime $dateJoined
     * @return User
     */
    public function setDateJoined($dateJoined)
    {
        $this->dateJoined = $dateJoined;

        return $this;
    }

    /**
     * Get dateJoined
     *
     * @return \DateTime 
     */
    public function getDateJoined()
    {
        return $this->dateJoined;
    }
}

所以我的问题是我可以添加以下内容,以便在保存之前设置 dateJoined:

lifecycleCallbacks:
        prePersist: [ setDateJoinedInsert ]

但是我的问题是,因为我创建了列,所以我还生成了一个 mutator(setter),这意味着有人可以覆盖我不想做的 dateJoined 值。那么有没有办法不自动生成变异器,或者我必须从实体文件中删除它?我遇到的问题是,如果有人对 YAML 文件进行更改并重新生成实体文件,那么将再次创建增变器。

【问题讨论】:

    标签: php symfony doctrine-orm doctrine yaml


    【解决方案1】:

    您可以在设置器中进行自己的覆盖,因此永远无法设置。

    public function setDateJoined($dateJoined)
    {
        $this->dateJoined = new \DateTime('now');
    
        return $this;
    }
    

    【讨论】:

    • 但是有人仍然可以访问该设置器,我想要它以便该值只设置一次。
    • @OliverBS 在 setter 中做检查 if ($this-&gt;dateJoined != null) ?
    • 但我仍然可以传递一些东西,我可以传递今天的日期。我知道它不会使用该日期,但我不希望日期覆盖,我想知道 YAML 映射器中是否有办法告诉它不要使用设置器
    • @OliverBS 可能会为 PrePersist 回调创建一个新的设置器?
    • 这真的是我唯一的选择,为 PrePersist 创建新的设置器并删除旧的设置器,但这是一个手动过程,我的问题是如果有人重新运行映射器,我会丢失它跨度>
    【解决方案2】:

    就像 user3442077 所说,如果您检查字段的值,您将只能设置一次。 如果对象是用一个值水合的,那么 setter 不会做任何事情,即使你用一个值调用它。

    【讨论】:

      猜你喜欢
      • 2011-12-01
      • 2016-02-04
      • 1970-01-01
      • 2021-01-30
      • 2011-11-16
      • 1970-01-01
      • 2012-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多