使用Symony3和stofDoctrineExtensionBundle配置具有特征的Gedmo树repository



我收到错误:

Type error: Argument 2 passed to AppBundleRepositoryCategoryRepository::__construct()
must be an instance of AppBundleRepositoryClassMetadata, 
instance of DoctrineORMMappingClassMetadata given, 
called in C:_DEV_SF3_fs3_treevendordoctrineormlibDoctrineORMRepositoryDefaultRep‌​ositoryFactory.php on line 68
500 Internal Server Error - FatalThrowableError

我正在使用:

Symfony v3.0.6;
Doctrine v2.5.4
StofDoctrineExtensionsBundle

以便管理树状结构。

为了使用特性配置树存储库,我按照文档中的做法进行了配置。我得到了问题开头显示的错误。注意,如果我像文档中所说的那样通过扩展抽象存储库来配置树存储库,我会有不同的错误

如何向参数二提供"AppBundle\Repository\ClassMetadata的实例"?

我的树存储库

// AppBundleRepositoryCategoryRepository.php
<?php
namespace AppBundleRepository;
use GedmoTreeTraitsRepositoryORMNestedTreeRepositoryTrait;
use DoctrineORMEntityRepository;
use DoctrineORMEntityManager;
class CategoryRepository extends EntityRepository
{
    use NestedTreeRepositoryTrait;
    public function __construct(EntityManager $em, ClassMetadata $class)
    {
        parent::__construct($em, $class);
        $this->initializeTreeRepository($em, $class);
    }
}

我的类别实体

// AppBundleEntityCategory.php
<?php
namespace AppBundleEntity;
use GedmoMappingAnnotation as Gedmo;
use DoctrineORMMapping as ORM;
use SymfonyComponentValidatorConstraints as Assert;
/**
 * @GedmoTree(type="nested")
 * @ORMTable(name="categories")
 * use repository for handy tree functions
 * @ORMEntity(repositoryClass="AppBundleRepositoryCategoryRepository")
 */
class Category
{
    /**
     * @ORMColumn(type="integer")
     * @ORMId
     * @ORMGeneratedValue
     */
    private $id;
    /**
     * @ORMColumn(length=64)
     */
    private $title;
    /**
     * @GedmoTreeLeft
     * @ORMColumn(type="integer")
     */
    private $lft;
    /**
     * @GedmoTreeLevel
     * @ORMColumn(type="integer")
     */
    private $lvl;
    /**
     * @GedmoTreeRight
     * @ORMColumn(type="integer")
     */
    private $rgt;
    /**
     * @GedmoTreeRoot
     * @ORMManyToOne(targetEntity="Category")
     * @ORMJoinColumn(referencedColumnName="id", onDelete="CASCADE")
     */
    private $root;
    /**
     * @GedmoTreeParent
     * @ORMManyToOne(targetEntity="Category", inversedBy="children")
     * @ORMJoinColumn(referencedColumnName="id", onDelete="CASCADE")
     */
    private $parent;
    /**
     * @ORMOneToMany(targetEntity="Category", mappedBy="parent")
     * @ORMOrderBy({"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 DoctrineCommonCollectionsArrayCollection();
    }
    /**
     * 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 AppBundleEntityCategory $root
     *
     * @return Category
     */
    public function setRoot(AppBundleEntityCategory $root = null)
    {
        $this->root = $root;
        return $this;
    }
    /**
     * Add child
     *
     * @param AppBundleEntityCategory $child
     *
     * @return Category
     */
    public function addChild(AppBundleEntityCategory $child)
    {
        $this->children[] = $child;
        return $this;
    }
    /**
     * Remove child
     *
     * @param AppBundleEntityCategory $child
     */
    public function removeChild(AppBundleEntityCategory $child)
    {
        $this->children->removeElement($child);
    }
    /**
     * Get children
     *
     * @return DoctrineCommonCollectionsCollection
     */
    public function getChildren()
    {
        return $this->children;
    }
}

请告知。感谢您的时间和知识。

似乎您错过了导入类的命名空间

因此将此语句添加到类CategoryRepository:的use列表中

use DoctrineORMMappingClassMetadata;

所以试试这个:

AppBundle\Repository\CategoryRepository.php

namespace AppBundleRepository;
use GedmoTreeTraitsRepositoryORMNestedTreeRepositoryTrait;
use DoctrineORMEntityRepository;
use DoctrineORMEntityManager;
use DoctrineORMMappingClassMetadata;  // <-- ADD THIS
class CategoryRepository extends EntityRepository
{
    use NestedTreeRepositoryTrait;
    public function __construct(EntityManager $em, ClassMetadata $class)
    {
        parent::__construct($em, $class);
        $this->initializeTreeRepository($em, $class);
    }

最新更新