【问题标题】:Different behaviour with slightly similar entity具有略微相似实体的不同行为
【发布时间】:2014-01-22 18:42:08
【问题描述】:

我用 Symfony2 制作了一个 Web 应用程序。有两种用户,UserOperatorUserGroundStation。它们都扩展了User

用户地面站

    namespace Acme\ManagementBundle\Entity;

    use Doctrine\ORM\Mapping as ORM;
    use Doctrine\Common\Collections\ArrayCollection;
    use Doctrine\Common\Collections\Collection;
    use PUGX\MultiUserBundle\Validator\Constraints\UniqueEntity;
    use Symfony\Component\Validator\Constraints as Assert;

    /**
     * @ORM\Entity
     * @ORM\HasLifecycleCallbacks()
     * @ORM\Table(name="user_GroundStation")
     * @UniqueEntity(fields = "username", targetClass = "Acme\ManagementBundle\Entity\User",         
    message="Username already_used")
     * @UniqueEntity(fields = "email", targetClass = "Acme\ManagementBundle\Entity\User", 
    message="Email already_used")
     */

    class UserGroundStation extends User
    {
        /**
         * @ORM\Id
         * @ORM\Column(type="integer")
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        protected $id;
             /** 
         * @ORM\Column(type="string", length=60)
         * @var String
         */
        protected $name;
        /**
         * @var float
         *
         * @ORM\Column(name="latitude", type="float")
         */
        private $latitude;
        /**
         * @var float
         *
         * @ORM\Column(name="longitude", type="float")
         */
        private $longitude;

        /**
         * Set latitude
         *
         * @param string $latitude
         * @return UserGroundStation
         */
        public function setLatitude($latitude)
        {
            $this->latitude = $latitude;

            return $this;
        }

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

        /**
         * Set longitude
         *
         * @param float $longitude
         * @return UserGroundStation
         */
        public function setLongitude($longitude)
        {
            $this->longitude = $longitude;   
            return $this;
        }
        /**
         * Get longitude
         *
         * @return float 
         */
        public function getLongitude()
        {
            return $this->longitude;
        }
        /**
         * @ORM\PrePersist
         */
        public function setCreatedAtValue()
        {
            $this->addRole('ROLE_GS');
        }       
    }

用户操作员

  namespace Acme\ManagementBundle\Entity;

  use Doctrine\ORM\Mapping as ORM;
  use Doctrine\Common\Collections\ArrayCollection;
  use Doctrine\Common\Collections\Collection;
  use PUGX\MultiUserBundle\Validator\Constraints\UniqueEntity;
  use Symfony\Component\Validator\Constraints as Assert;

  /**
   * @ORM\Entity
   * @ORM\HasLifecycleCallbacks()
   * @ORM\Table(name="user_Operator")
   * @UniqueEntity(fields = "username", targetClass = "Acme\ManagementBundle\Entity\User", 
   message="Username already_used")
   * @UniqueEntity(fields = "email", targetClass = "Acme\ManagementBundle\Entity\User", 
   message="Email already_used")
   */

  class UserOperator extends User
  {
      /**
       * @ORM\Id
       * @ORM\Column(type="integer")
       * @ORM\GeneratedValue(strategy="AUTO")
       */
      protected $id;
       /** 
       * @ORM\Column(type="string", length=60)
       * @var String
       */
      protected $name;
       /**
       * @ORM\PrePersist
       */
      public function setCreatedAtValue()
      {
          $this->addRole('ROLE_OPERATOR');
      }    
  }

它们扩展User

当我调用UserOperator 的注册页面时,它可以正常工作,当我调用UserGroundStation 的注册页面时,Symfony 会提醒我:

属性“mission”和方法“getMission()”、“isMission()”、“hasMission()”、“__get()”都不存在并且在类“Acme\ManagementBundle\Entity”中具有公共访问权限\UserGroundStation”。

这怎么可能?我在哪里可以找到错误?

用户

  namespace Acme\ManagementBundle\Entity;

  use Doctrine\ORM\Mapping as ORM;
  use FOS\UserBundle\Model\User as BaseUser;
  use Doctrine\Common\Collections\ArrayCollection;
  use Doctrine\Common\Collections\Collection;


  /**
   * @ORM\Entity
   * @ORM\Table(name="user")
   * @ORM\InheritanceType("JOINED")
   * @ORM\DiscriminatorColumn(name="type", type="string")
   * @ORM\DiscriminatorMap({"user_one" = "UserGroundStation", "user_two" = "UserOperator"})
   * @ORM\MappedSuperclass()
   *
   */
  abstract class User extends BaseUser
  {
      /**
       * @ORM\Id
       * @ORM\Column(type="integer")
       * @ORM\GeneratedValue(strategy="AUTO")
       */
      protected $id;
          /**
       * @ORM\ManyToMany(targetEntity="Acme\ManagementBundle\Entity\Mission", mappedBy="users")
       */
      protected $missions;

      public function __construct(){
          $this -> missions = new ArrayCollection();
      }

      public function setMissions(Collection $missions){
          $this -> missions = $missions;
          return $this;
      }

      public function addMission($mission){
          $this -> missions -> add($mission);
          return $this;
      }

      public function getMissions(){
          return $this -> missions;
      }

【问题讨论】:

  • 你应该发布User类的内容;从它的声音来看,您没有正确实现多关系所需的接口。
  • 过去我在从基础实体扩展时遇到了很多问题。尝试将这些方法也放在UserGroundStation 中。至少在其中调用了parent::method() 的方法,只是为了看看它是否是层次结构问题。

标签: php symfony registration


【解决方案1】:

这确实是一个虚拟问题。

它们有不同的 FormType:

RegistrationUserOperatorFormType 与 RegistrationUserGroundStationFormType 不同,并且 ProfileUserGroundStationFormType 与 ProfileUserOperatorFormType 不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多