首页 文章

属性“父”都不构建Symfony 2自引用映射

提问于
浏览
1

我有一个包含自引用映射的实体 . 我想在系统中添加新的类别和子类别,但我不知道如何正确构建添加表单 . 生成获取并在实体中生成setter . 我收到一个错误:

属性“parent”和方法“addParent()”/“removeParent()”,“setParent()”,“parent()”,“__ set()”或“__call()”都不存在类“Adevo \ ClassifiedsBundle \ Entity \ ClassifiedsCategory”中的公共访问 .

namespace XXX\ClassifiedsBundle\Entity;

    use Doctrine\ORM\Mapping as ORM;


    /**
     * @ORM\Entity(repositoryClass="XXX\ClassifiedsBundle\Repository\ClassifiedsCategoryRepository")
     * @ORM\Table(name="classifieds_categories")
     */
    class ClassifiedsCategory extends ClassifiedsAbstractTaxonomy {

        /**
         * @ORM\OneToMany(
         *      targetEntity = "Classifieds",
         *      mappedBy = "category"
         * )
         */
        protected $classifieds;

        /**
         * @ORM\ManyToMany(targetEntity="ClassifiedsCategory", mappedBy="parent")
         */
        private $children;

        /**
         *
         * @ORM\ManyToMany(targetEntity="ClassifiedsCategory", inversedBy="children")
         * @ORM\JoinTable(name="subCategory",
         *  joinColumns={@ORM\JoinColumn(name="category_id", referencedColumnName="id")},
         *  inverseJoinColumns={@ORM\JoinColumn(name="parent_id", referencedColumnName="id")}
         *     )
         */
        private $parent;

        /**
         * Constructor
         */
        public function __construct() {

            $this->children = new \Doctrine\Common\Collections\ArrayCollection();
            $this->parent = new \Doctrine\Common\Collections\ArrayCollection();
        }

        /**
         * Add classified
         *
         * @param \XXX\ClassifiedsBundle\Entity\Classifieds $classified
         *
         * @return ClassifiedsCategory
         */
        public function addClassified(\XXX\ClassifiedsBundle\Entity\Classifieds $classified) {
            $this->classifieds[] = $classified;

            return $this;
        }

        /**
         * Remove classified
         *
         * @param \XXX\ClassifiedsBundle\Entity\Classifieds $classified
         */
        public function removeClassified(\XXX\ClassifiedsBundle\Entity\Classifieds $classified) {
            $this->classifieds->removeElement($classified);
        }

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

        /**
         * Add child
         *
         * @param \XXX\ClassifiedsBundle\Entity\ClassifiedsCategory $child
         *
         * @return ClassifiedsCategory
         */
        public function addChild(\XXX\ClassifiedsBundle\Entity\ClassifiedsCategory $child) {
            $this->children[] = $child;

            return $this;
        }

        /**
         * Remove child
         *
         * @param \XXX\ClassifiedsBundle\Entity\ClassifiedsCategory $child
         */
        public function removeChild(\XXX\ClassifiedsBundle\Entity\ClassifiedsCategory $child) {
            $this->children->removeElement($child);
        }

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

        /**
         * Add parent
         *
         * @param \XXX\ClassifiedsBundle\Entity\ClassifiedsCategory $parent
         *
         * @return ClassifiedsCategory
         */
        public function addParent(\XXX\ClassifiedsBundle\Entity\ClassifiedsCategory $parent) {
            $this->parent[] = $parent;

            return $this;
        }

        /**
         * Remove parent
         *
         * @param \XXX\ClassifiedsBundle\Entity\ClassifiedsCategory $parent
         */
        public function removeParent(\XXX\ClassifiedsBundle\Entity\ClassifiedsCategory $parent) {
            $this->parent->removeElement($parent);
        }

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

    }
<pre>



 namespace XXX\ClassifiedsBundle\Entity;

    use Doctrine\ORM\Mapping as ORM;


    /**
     * @ORM\MappedSuperclass
     * @ORM\HasLifecycleCallbacks
     */
    abstract class ClassifiedsAbstractTaxonomy {

        /**
         * @ORM\Column(type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;

        /**
         * @ORM\Column(type="string", length=120, unique=true)
         */
        private $name;

        /**
         * @ORM\Column(type="string", length=120, unique=true)
         */
        private $slug;

        protected $classifieds;


        /**
         * Constructor
         */
        public function __construct()
        {
            $this->classifieds = new \Doctrine\Common\Collections\ArrayCollection();
    //        $this->children = new \Doctrine\Common\Collections\ArrayCollection();
    //        $this->parent = new \Doctrine\Common\Collections\ArrayCollection();
        }

        /**
         * Add classifieds
         *
         * @param \XXX\ClassifiedsBundle\Entity\Classifieds $classifieds
         * @return ClassifiedsCategory
         */
        public function addClassifieds(\XXX\ClassifiedsBundle\Entity\Classifieds $classifieds)
        {
            $this->classifieds[] = $classifieds;

            return $this;
        }

        /**
         * Remove classifieds
         *
         * @param \XXX\ClassifiedsBundle\Entity\Classifieds $classifieds
         */
        public function removeClassifieds(\XXX\ClassifiedsBundle\Entity\Classifieds $classifieds)
        {
            $this->classifieds->removeElement($classifieds);
        }

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

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

        /**
         * Set name
         *
         * @param string $name
         * @return AbstractTaxonomy
         */
        public function setName($name)
        {
            $this->name = $name;

            return $this;
        }

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

        /**
         * Set slug
         *
         * @param string $slug
         * @return AbstractTaxonomy
         */
        public function setSlug($slug)
        {
            $this->slug = \XXX\ClassifiedsBundle\Libs\Utils::sluggify($slug);

            return $this;
        }

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

        /**
         * @ORM\PrePersist
         * @ORM\PreUpdate
         */
        public function preSave(){
            if(null === $this->slug){
                $this->setSlug($this->getName());
            }
        }
    }
namespace XXX\AdminBundle\Form\Type;

    use XXX\AdminBundle\Form\Type\ClassifiedsTaxonomyType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;

    class ClassifiedsCategoryType extends ClassifiedsTaxonomyType {

        public function getName() {
            return 'taxonomy';
        }

        public function buildForm(FormBuilderInterface $builder, array $options) {
            $builder
            ->add('name', 'text', array(
            'label' => 'Tytuł'
            ))
            ->add('slug', 'text', array(
            'label' => 'Alias'
            ))
            ->add('parent', 'entity', array(
            'class' => 'XXX\ClassifiedsBundle\Entity\ClassifiedsCategory',
            'property' => 'name',
            'empty_value' => 'Choose a parent category',
            'required' => false,
            ))

            ->add('save', 'submit', array(
                'label' => 'Zapisz'
            ));
        }

        public function setDefaultOptions(OptionsResolverInterface $resolver) {
            $resolver->setDefaults(array(
                'data_class' => 'XXX\ClassifiedsBundle\Entity\ClassifiedsCategory'
            ));
        }

    }

1 回答

  • 0

    您的FormType ClassifiedsCategoryType 期待 ClassifiedsCategory 的实例,这需要属性 parent 到目前为止很好 . 但是当您处理从表单到控制器的请求时,formbuilder组件会尝试通过实体上的set方法将输入的值设置为该属性 . 实体类中缺少此set方法( setParent ) .

    所以你必须像这样实现它:

    public function setParent($parent)
    {
        $this->parent = $parent;
    
        return $this;
    }
    

相关问题