0

FOSUserBundle と「グループ」機能を使用します

最初は私の User.php にこんなゲッターやセッターがありました

/**
 * Add groups
 *
 * @param \Acme\UserBundle\Entity\Group $groups
 * @return User
 */

public function addGroup(\Acme\UserBundle\Entity\Group $groups)
{
    $this->groups[] = $groups;

    return $this;
}

/**
 * Remove groups
 *
 * @param \Acme\UserBundle\Entity\Group $groups
 */
public function removeGroup(\Acme\UserBundle\Entity\Group $groups)
{
    $this->groups->removeElement($groups);
}

/**
 * Get groups
 *
 * @return \Doctrine\Common\Collections\Collection
 */
public function getGroups()
{
    return $this->groups;
}

しかし、このエラーが発生します

FatalErrorException: Compile Error: Declaration of Acme\UserBundle\Entity\User::addGroup() must be compatible with that of FOS\UserBundle\Model\GroupableInterface::addGroup() 

FOS\UserBundle\Model\GroupableInterface 内

public function addGroup(GroupInterface $group);

私の Acme\UserBundle\Entity\User に

public function addGroup(\Acme\UserBundle\Entity\Group $groups)
{
    $this->groups[] = $groups;

    return $this;
}


引数の型を調整したり、このエラーを修正するにはどうすればよいですか?


今のところ、これら 3 つの関数をコメントアウトしています。

当時はうまく機能しているように見えました。

しかし今、私はSonataadminバンドルを使用しています

@SonataAdminBundle/Admin/UserAdmin.php

protected function configureFormFields(FormMapper $formMapper){
    $formMapper
      ->with('General')
      ->add('groups','entity',array('property' => 'name',
              'multiple' => true,
              'class' => 'UserBundle:Group',
      ))
}

このフォームは正しく表示されますが、送信ボタンを押して登録すると、

それが示している

Error: Call to a member function contains() on a non-object in ~~~/FOS/UserBundle/Model/User.php line 572

/FOS/UserBundle/Model/user.php には、これに近い機能があります

public function addGroup(GroupInterface $group)
{  
   var_dump($group);# I added to check
   if (!$this->getGroups()->contains($group)) {
        $this->getGroups()->add($group);
    }
    return $this;
}

var_dump($group) ショー

object(Acme\UserBundle\Entity\Group)#923 (3) { ["id":protected]=> int(2) ["name":protected]=> string(12) "TeacherGroup" ["roles":protected]=> array(0) { } }

私はそれがグループ情報を正しく持っていると思います..

この問題を解決するにはどうすればよいですか?

私のuser.php全体

// src/Acme/UserBundle/Entity/User.php

namespace Acme\UserBundle\Entity;


use FOS\UserBundle\Entity\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use FOS\UserBundle\Model\GroupableInterface;

/**
 * @ORM\Entity
 * @ORM\Table(name="fos_user")
 * @ORM\HasLifecycleCallbacks
 */
class User extends BaseUser
{
/**
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 * 
 */
protected $id;
/**
 *
 * @ORM\OneToOne(targetEntity="Acme\UserBundle\Entity\Lesson", mappedBy="teacher")
 */
private $LessonAsTeacher;
/**
 *
 * @ORM\OneToMany(targetEntity="Acme\UserBundle\Entity\Lesson", mappedBy="student*removethis : name of the variable in Lesson.php*")
 */
private $LessonAsStudent; 

  /**
 *
 * @ORM\ManyToOne(targetEntity="Acme\UserBundle\Entity\Sex", inversedBy="sex*removethis : name of the variable in user.php*")
 * @ORM\JoinColumn(name="sex", referencedColumnName="id",nullable=false)
 */
private $sex;


 /**
 * @ORM\ManyToMany(targetEntity="Acme\UserBundle\Entity\Group")
 * @ORM\JoinTable(name="fos_user_user_group",
 *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")}
 * )
 */
protected $groups; 
    /**
 * @ORM\Column(type="string", length=255)
 *
 * @Assert\NotBlank(message="Please enter your first name.", groups={"Registration", "Profile"})
 * @Assert\MinLength(limit="0", message="The name is too short.", groups={"Registration", "Profile"})
 * @Assert\MaxLength(limit="255", message="The name is too long.", groups={"Registration", "Profile"})
 */
protected $firstname;

 /**
 * @ORM\Column(type="string", length=255)
 *
 * @Assert\NotBlank(message="Please enter your last name.", groups={"Registration", "Profile"})
 * @Assert\MinLength(limit="0", message="The name is too short.", groups={"Registration", "Profile"})
 * @Assert\MaxLength(limit="255", message="The name is too long.", groups={"Registration", "Profile"})
 */
protected $lastname;

 /**
 * @ORM\Column(type="date")
 */  
protected $birthday;

    /**
 * @var \DateTime
 *
 * @ORM\Column(name="createdAt", type="datetime")
 */
private $createdAt;

/**
 * @var \DateTime
 *
 * @ORM\Column(name="updatedAt", type="datetime")
 */
private $updatedAt;



public function __construct()
{
    parent::__construct();
    // your own logic
}
public function getFirstname()
{
    return $this->firstname;
}
public function setFirstname($name)
{
    $this->firstname = $name;
    return $this;
}
public function getLastname()
{
    return $this->lastname;
}
public function setLastname($name)
{
    $this->lastname = $name;
    return $this;
}
public function getSex()
{
    return $this->sex;
}
public function setSex($sex)
{
    $this->sex = $sex;
    return $this;
}

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





/**
 * Set age
 *
 * @param integer $age
 * @return User
 */
public function setAge($age)
{
    $this->age = $age;

    return $this;
}

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

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

    return $this;
}

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

/**
 * @ORM\PrePersist
 */

public function prePersist()
{
    $this->createdAt = new \DateTime;
    $this->updatedAt = new \DateTime;
}

/**
 * @ORM\PreUpdate
 */
public function preUpdate()
{
    $this->updatedAt = new \DateTime;
}

/**
 * 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 updatedAt
 *
 * @param \DateTime $updatedAt
 * @return User
 */
public function setUpdatedAt($updatedAt)
{
    $this->updatedAt = $updatedAt;

    return $this;
}

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


/**
 * Get groups
 *
 * @return \Doctrine\Common\Collections\Collection 
 */
public function getGroups()
{
    return $this->groups;
}


/**
 * Add groups
 *
 * @param \Acme\UserBundle\Entity\Group $groups
 * @return User
 */
//  public function addGroup(\Acme\UserBundle\Entity\Group $groups)
//  {
//      $this->groups[] = $groups;

//     return $this;
// }

/**
 * Remove groups
 *
 * @param \Acme\UserBundle\Entity\Group $groups
 */
//  public function removeGroup(\Acme\UserBundle\Entity\Group $groups)
//  {
//      $this->groups->removeElement($groups);
//  }
}

私のGroup.php全体

namespace Acme\UserBundle\Entity;

use FOS\UserBundle\Entity\Group as BaseGroup;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="fos_group")
 */
class Group extends BaseGroup
{
/**
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 */
   protected $id;

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

4 に答える 4

4

同じエラーが発生しました:

FatalErrorException: Compile Error: Declaration of Acme\UserBundle\Entity\User::addGroup() must be compatible with that of FOS\UserBundle\Model\GroupableInterface::addGroup() 

検索した結果、( FOS Git Issue 988 ) この特別なエラーは Doctrine の「バグ」または sth であることがわかりました。

基本クラスに addGroup() の実装があるため、Doctrine はメソッドをまったく生成すべきではありません。から署名を変更することで回避しました

public function addGroup(\MyBundleNamespace\Entity\Group $groups)
public function removeGroup(\MyBundleNamespace\Entity\Group $groups)

public function addGroup(\FOS\UserBundle\Model\GroupInterface $groups)
public function removeGroup(\FOS\UserBundle\Model\GroupInterface $groups)

このようにして、Doctrine が間違った署名でこれら 2 つの関数を生成するのを防ぎます。

バージョン情報:

Symfony       2.2.1
DoctrineORM   2.2.3
FOSUserBundle 1.3.1
PHP           5.4.4-14

多分これは他の誰かを助けることができます!

于 2013-04-25T16:10:12.903 に答える
0

私はこの問題に遭遇しました。簡単な解決策は、groups 変数の宣言を public から protected に変更することでした。

 /**
  * @var \Doctrine\Common\Collections\Collection
  */
 protected $groups;
于 2014-02-19T03:14:12.067 に答える