Ошибка аргумента 2 при настройке репозитория дерева Gedmo с трейтами с использованием Symony3 и stofDoctrineExtensionsBundle

Я получаю сообщение об ошибке:

Type error: Argument 2 passed to AppBundle\Repository\CategoryRepository::__construct()
must be an instance of AppBundle\Repository\ClassMetadata, 
instance of Doctrine\ORM\Mapping\ClassMetadata given, 
called in C:\_DEV_SF3_\fs3_tree\vendor\doctrine\orm\lib\Doctrine\ORM\Repository\DefaultRep‌​ositoryFactory.php on line 68
500 Internal Server Error - FatalThrowableError

Я использую:

Symfony v3.0.6;
Doctrine v2.5.4
StofDoctrineExtensionsBundle

для управления древовидной структурой.

Чтобы настроить репозиторий дерева с использованием трейтов, я делаю, как в документация. И я получаю ошибку, которая показана в начале вопроса. Обратите внимание, что если я настрою древовидный репозиторий, расширив абстрактный репозиторий, как указано в документация у меня есть другая ошибка

Как я могу предоставить «экземпляр AppBundle\Repository\ClassMetadata» для второго аргумента?

Мое хранилище деревьев

// AppBundle\Repository\CategoryRepository.php
<?php

namespace AppBundle\Repository;

use Gedmo\Tree\Traits\Repository\ORM\NestedTreeRepositoryTrait;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\EntityManager;

class CategoryRepository extends EntityRepository
{
    use NestedTreeRepositoryTrait;

    public function __construct(EntityManager $em, ClassMetadata $class)
    {
        parent::__construct($em, $class);

        $this->initializeTreeRepository($em, $class);
    }
}

Моя категория объекта

// AppBundle\Entity\Category.php
<?php

namespace AppBundle\Entity;

use Gedmo\Mapping\Annotation as Gedmo;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @Gedmo\Tree(type="nested")
 * @ORM\Table(name="categories")
 * use repository for handy tree functions
 * @ORM\Entity(repositoryClass="AppBundle\Repository\CategoryRepository")
 */
class Category
{
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue
     */
    private $id;

    /**
     * @ORM\Column(length=64)
     */
    private $title;

    /**
     * @Gedmo\TreeLeft
     * @ORM\Column(type="integer")
     */
    private $lft;

    /**
     * @Gedmo\TreeLevel
     * @ORM\Column(type="integer")
     */
    private $lvl;

    /**
     * @Gedmo\TreeRight
     * @ORM\Column(type="integer")
     */
    private $rgt;

    /**
     * @Gedmo\TreeRoot
     * @ORM\ManyToOne(targetEntity="Category")
     * @ORM\JoinColumn(referencedColumnName="id", onDelete="CASCADE")
     */
    private $root;

    /**
     * @Gedmo\TreeParent
     * @ORM\ManyToOne(targetEntity="Category", inversedBy="children")
     * @ORM\JoinColumn(referencedColumnName="id", onDelete="CASCADE")
     */
    private $parent;

    /**
     * @ORM\OneToMany(targetEntity="Category", mappedBy="parent")
     * @ORM\OrderBy({"lft" = "ASC"})
     */
    private $children;

    public function getId()
    {
        return $this->id;
    }

    public function setTitle($title)
    {
        $this->title = $title;
    }

    public function getTitle()
    {
        return $this->title;
    }

    public function getRoot()
    {
        return $this->root;
    }

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

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

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

    /**
     * Set lft
     *
     * @param integer $lft
     *
     * @return Category
     */
    public function setLft($lft)
    {
        $this->lft = $lft;

        return $this;
    }

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

    /**
     * Set lvl
     *
     * @param integer $lvl
     *
     * @return Category
     */
    public function setLvl($lvl)
    {
        $this->lvl = $lvl;

        return $this;
    }

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

    /**
     * Set rgt
     *
     * @param integer $rgt
     *
     * @return Category
     */
    public function setRgt($rgt)
    {
        $this->rgt = $rgt;

        return $this;
    }

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

    /**
     * Set root
     *
     * @param \AppBundle\Entity\Category $root
     *
     * @return Category
     */
    public function setRoot(\AppBundle\Entity\Category $root = null)
    {
        $this->root = $root;

        return $this;
    }

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

        return $this;
    }

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

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

Пожалуйста, порекомендуйте. Спасибо за ваше время и знания.


person Rikijs    schedule 17.05.2016    source источник


Ответы (1)


person    schedule
comment
Спасибо, Маттео, больше нет ошибки аргумента - теперь она показывает другую ошибку. Один описан здесь, в StackOverflow - person Rikijs; 17.05.2016
comment
Так же работает и с use Doctrine\Common\Persistence\Mapping\ClassMetadata; не знаю как лучше: Ваше предложение или этот код или не важно!? - person Rikijs; 17.05.2016
comment
привет @Rikijs в PHP нет большой разницы. Кстати, вы должны использовать тот же тип, который объявлен в конструкторе, который вы переопределяете. Конечно, вы указываете интерфейс, поэтому обычно это лучше, чем конкретный класс реализации. - person Matteo; 17.05.2016