【问题标题】:symfony2, doctrine2, class inheritancesymfony2,教义2,类继承
【发布时间】:2015-12-21 17:07:06
【问题描述】:

我正在玩一些学说和 symfony,但我遇到了这个模型的问题。 我设置了一个基类(实体),然后是一个子类(实体),到目前为止一切正常,之后我想向我的表中添加更多字段,我使用了学说:生成:实体 BundleName。这就是问题所在。如果我没有将基类中的变量设置为受保护的 symfony / 学说,它表示它无法访问该变量,但如果我将其设置为受保护并再次生成实体,它会为我的子类中的基类中的受保护变量创建 getter 和 setter我觉得这很奇怪,所以我用谷歌搜索了一下,但我只找到了一个关于这个问题的主题并且没有答案。 基类设置了注解 MappedSuperclass 但.. 对它没有任何影响。

实现 AdvancedUserInterface 的基类

<?php
namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\AdvancedUserInterface;

/**
 * @ORM\MappedSuperclass
 */
class BaseUser implements AdvancedUserInterface
{
    /**
     * @var string
     * @ORM\Column(name="username", type="string", length=255, nullable=true)
     */
    protected $username;

    /**
     * @var string
     * @ORM\Column(name="password", type="string", length=255)
     */
    protected $password;

    /**
     * @var bool
     * @ORM\Column(name="isActive", type="boolean")
     */
    protected $isActive = '0';

    /**
     * [$isAccountNonExpired description].
     *
     * @var bool
     * @ORM\Column(name="isAccountNonExpired", type="boolean")
     */
    protected $isAccountNonExpired = '1';

    /**
     * [$isAccountNonLocked description].
     *
     * @var bool
     * @ORM\Column(name="isAccountNonLocked", type="boolean")
     */
    protected $isAccountNonLocked = '0';

    /**
     * [$isCredentialsNonExpired description].
     *
     * @var bool
     * @ORM\Column(name="isCredentialsNonExpired", type="boolean")
     */
    protected $isCredentialsNonExpired = '0';
    /**
     * Set password
     *
     * @param string $password
     * @return User
     */
    public function setPassword($password)
    {
        $this->password = $password;

        return $this;
    }

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

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

        return $this;
    }

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

    /**
     * USER INTERFACE IMPLEMENTATION.
     */
    public function getSalt()
    {
        // you *may* need a real salt depending on your encoder
        // see section on salt below
    }

    public function getRoles()
    {
        return array('ROLE_ADMIN');
    }

    public function eraseCredentials()
    {
        return $this->plainPassword = null;
    }

    /**
     * ADVANCED USER INTERFACE IMPLEMENTATION.
     */

    /**
     * Checks whether the user's account has expired.
     *
     * Internally, if this method returns false, the authentication system
     * will throw an AccountExpiredException and prevent login.
     *
     * @return bool true if the user's account is non expired, false otherwise
     *
     * @see AccountExpiredException
     */
    public function isAccountNonExpired()
    {
        return $this->isAccountNonExpired;
    }

    /**
     * Checks whether the user is locked.
     *
     * Internally, if this method returns false, the authentication system
     * will throw a LockedException and prevent login.
     *
     * @return bool true if the user is not locked, false otherwise
     *
     * @see LockedException
     */
    public function isAccountNonLocked()
    {
        return $this->isAccountNonLocked;
    }

    /**
     * Checks whether the user's credentials (password) has expired.
     *
     * Internally, if this method returns false, the authentication system
     * will throw a CredentialsExpiredException and prevent login.
     *
     * @return bool true if the user's credentials are non expired, false otherwise
     *
     * @see CredentialsExpiredException
     */
    public function isCredentialsNonExpired()
    {
        return $this->isCredentialsNonExpired;
    }

    /**
     * Checks whether the user is enabled.
     *
     * Internally, if this method returns false, the authentication system
     * will throw a DisabledException and prevent login.
     *
     * @return bool true if the user is enabled, false otherwise
     *
     * @see DisabledException
     */
    public function isEnabled()
    {
        return $this->isActive;
    }

    /**
     * Set isActive
     *
     * @param boolean $isActive
     * @return BaseUser
     */
    public function setIsActive($isActive)
    {
        $this->isActive = $isActive;

        return $this;
    }

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

    /**
     * Set isAccountNonExpired
     *
     * @param boolean $isAccountNonExpired
     * @return BaseUser
     */
    public function setIsAccountNonExpired($isAccountNonExpired)
    {
        $this->isAccountNonExpired = $isAccountNonExpired;

        return $this;
    }

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

    /**
     * Set isAccountNonLocked
     *
     * @param boolean $isAccountNonLocked
     * @return BaseUser
     */
    public function setIsAccountNonLocked($isAccountNonLocked)
    {
        $this->isAccountNonLocked = $isAccountNonLocked;

        return $this;
    }

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

    /**
     * Set isCredentialsNonExpired
     *
     * @param boolean $isCredentialsNonExpired
     * @return BaseUser
     */
    public function setIsCredentialsNonExpired($isCredentialsNonExpired)
    {
        $this->isCredentialsNonExpired = $isCredentialsNonExpired;

        return $this;
    }

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

还有子类

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Security\Core\User\AdvancedUserInterface;
use Gedmo\Mapping\Annotation as Gedmo;
use AppBundle\Entity\BaseUser;

/**
 * User
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Zenith\UserBundle\Entity\UserRepository")
 * @UniqueEntity(fields="email", message="Email already taken")
 * @UniqueEntity(fields="username", message="Username already taken")
 */
class User extends BaseUser
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="email", type="string", length=255)
     * @Assert\Email()
     * @Assert\NotBlank()
     */
    private $email;

    /**
     * @var  string
     * @Assert\NotBlank()
     * @Assert\Length(max = 4096)
     */
    protected $plainPassword;

    /**
     * Date when the user needs to change his password
     * for security reasons.
     *
     * @var datetime
     *
     * @ORM\Column(name="credentialsExpireAt", type="datetime", nullable=true)
     */
    private $credentialsExpireAt;

    /**
     * Date when the account expires
     * This can be used for temporary accounts.
     *
     * @var datetime
     *
     * @ORM\Column(name="accountExpireAt", type="datetime", nullable=true)
     */
    private $accountExpireAt;

    /**
     * Saves last login date of the user.
     *
     * @var datetime
     * @ORM\Column(name="lastLogin", type="datetime", nullable=true)
     */
    private $lastLogin;

    /**
     *
     *
     * @ORM\Column(name="createdAt", type="datetime")
     * @Gedmo\Timestampable(on="create")
     *
     * @var datetime
     */
    private $createdAt;

    /**
     * @ORM\Column(name="editedAt", type="datetime")
     * @Gedmo\Timestampable(on="update")
     *
     * @var datetime
     */
    private $editedAt;

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

    /**
     * Set email
     *
     * @param string $email
     * @return User
     */
    public function setEmail($email)
    {
        $this->email = $email;

        return $this;
    }

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

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

        return $this;
    }

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

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

        return $this;
    }

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

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

        return $this;
    }

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

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

        return $this;
    }

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

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

        return $this;
    }

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

}

【问题讨论】:

  • 我们能看到一些代码吗?这会有所帮助...
  • 确定我会编辑帖子

标签: symfony doctrine-orm


【解决方案1】:

那么问题是什么?为什么命令这样做?或者在这种情况下如何使用它?

doctrine:generate:entities 从它的映射中生成一个实体类。映射可以用不同的格式来描述,PHP注解只是其中一种(还有xml和yml)。我想逻辑是这样工作的——首先从创建注解映射,然后从映射(不管这个映射是如何描述的,以及如果没有继承属性)生成一个类。

所以不用担心,删除不必要的代码并继续前进。这只是一个可以节省一些时间的工具。

【讨论】:

  • 我的问题是为什么当我在变量上使用 protected 时,它会在子进程中生成 getter 和 setter,而它们已经存在于 base 中。以及如何解决这个问题。 :D
  • 因为当工具分析映射时,它没有考虑到该映射具有继承属性。
  • 而且你不必修复任何东西。只需删除一个备用代码即可。
猜你喜欢
  • 2023-04-08
  • 2015-06-30
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多