覆盖akeneo实体时出错

时间:2017-08-17 08:38:05

标签: php symfony doctrine-extensions akeneo

我尝试覆盖akeneo项目的category实体。我按照文档但总是有一个我无法解决的错误。

config.yml

中添加了此内容
-
    original: Pim\Bundle\CatalogBundle\Entity\Category
    override: MyBundle\CatalogBundle\Entity\Category
entities.yml

中的

parameters:
    pim_catalog.entity.category.class: MyBundle\CatalogBundle\Entity\Category

覆盖,category.php

<?php

namespace MyBundle\CatalogBundle\Entity;

use Pim\Bundle\CatalogBundle\Entity\Category as BaseCategory;

class Category extends BaseCategory
{
    protected $test;

    public function getTest()
    {
        return $this->test;
    }

    public function setTest($test)
    {
        $this->test = $test;

        return $this;
    }
}

category.orm.yml

MyBundle\CatalogBundle\Entity\Category:
    type: entity
    table: pim_catalog_category
    changeTrackingPolicy: DEFERRED_EXPLICIT
    repositoryClass: Akeneo\Bundle\ClassificationBundle\Doctrine\ORM\Repository\CategoryRepository
    uniqueConstraints:
        pim_category_code_uc:
            columns:
                - code
    gedmo:
        tree:
            type: nested
    fields:
        test:
            type: string
            length: 255
            nullable: true

然后在浏览器上出现以下错误:

UnexpectedValueException in TreeListener.php line 74: Tree object class: Pim\Bundle\CatalogBundle\Entity\Category must have tree metadata at this point

这是抛出异常的函数,它是gedmo教义扩展的一部分

 public function getStrategy(ObjectManager $om, $class)
{
    if (!isset($this->strategies[$class])) {
        $config = $this->getConfiguration($om, $class);

        if (!$config) {
            throw new \Gedmo\Exception\UnexpectedValueException("Tree object class: {$class} must have tree metadata at this point");
        }
        $managerName = 'UnsupportedManager';
        if ($om instanceof \Doctrine\ORM\EntityManager) {
            $managerName = 'ORM';
        } elseif ($om instanceof \Doctrine\ODM\MongoDB\DocumentManager) {
            $managerName = 'ODM\\MongoDB';
        }
        if (!isset($this->strategyInstances[$config['strategy']])) {
            $strategyClass = $this->getNamespace().'\\Strategy\\'.$managerName.'\\'.ucfirst($config['strategy']);

            if (!class_exists($strategyClass)) {
                throw new \Gedmo\Exception\InvalidArgumentException($managerName." TreeListener does not support tree type: {$config['strategy']}");
            }
            $this->strategyInstances[$config['strategy']] = new $strategyClass($this);
        }
        $this->strategies[$class] = $config['strategy'];
    }

    return $this->strategyInstances[$this->strategies[$class]];
}

2 个答案:

答案 0 :(得分:0)

确保您正在加载父项。

在文件/src/Acme/Bundle/CatalogBu​​ndle/AcmeCatalogBu​​ndle.php中添加

public function getParent()
{
    return 'PimCatalogBundle';
}

答案 1 :(得分:0)

解决方案:

由于DependencyInjection,发生了上述问题。为了解决此问题,请按照以下说明进行操作:

创建扩展类:

1) It has to live in the DependencyInjection namespace of the bundle;
2) It has to implement the ExtensionInterface, which is usually achieved by extending the Extension class;
3) The name is equal to the bundle name with the Bundle suffix replaced by Extension (e.g. the Extension class of the AcmeBundle would be called AcmeExtension and the one for AcmeCatalogBundle would be called AcmeCatalogExtension).

#/src/Acme/Bundle/CatalogBu​​ndle/DependencyInjection/AcmeCatalogExtension.php

<?php

namespace Acme\Bundle\CatalogBundle\DependencyInjection;

use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;

class AcmeCatalogExtension extends Extension
{
    public function load(array $configs, ContainerBuilder $container)
    {
        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
        $loader->load('entities.yml');
    }
}

让我知道您是否有任何疑问