【问题标题】:实现 TranslationInterface 时未找到映射文件
【发布时间】:2021-08-28 12:00:23
【问题描述】:

我正在使用 Ez-Extends 来扩展 Sonata Classification Bundle 的 Category 实体。

现在我想使用Knp\DoctrineBehaviors\Model\Translatable\TranslatableTrait 使我的类别可翻译。我在我的 Category 类中应用了这个特征,并让它实现了 TranslatableInterface。然后我创建一个新的 CategoryTranslation 类:

<?php

namespace App\Application\Sonata\ClassificationBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Knp\DoctrineBehaviors\Contract\Entity\TranslationInterface;
use Knp\DoctrineBehaviors\Model\Translatable\TranslationTrait;
use Symfony\Component\Serializer\Annotation\Groups;

/**
 * @ORM\Entity
 */
class CategoryTranslation implements TranslationInterface
{
    use TranslationTrait;

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

    /**
     * @var string | null
     * @ORM\Column(type="string")
     * @Groups("filter")
     */
    private $name;

    private $trans;

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

    /**
     * @param mixed $id
     * @return CategoryTranslation
     */
    public function setId($id)
    {
        $this->id = $id;
        return $this;
    }

    /**
     * @return string|null
     */
    public function getName(): ?string
    {
        return $this->name;
    }

    /**
     * @param string|null $name
     * @return CategoryTranslation
     */
    public function setName(?string $name): CategoryTranslation
    {
        $this->name = $name;
        return $this;
    }

    /**
     * @return mixed
     */
    public function getTrans()
    {
        return $this->trans;
    }

    /**
     * @param mixed $trans
     * @return CategoryTranslation
     */
    public function setTrans($trans)
    {
        $this->trans = $trans;
        return $this;
    }



}

但是,当我尝试在应用程序中执行任何操作时,我现在会收到以下消息:

In MappingException.php line 65:

  No mapping file found named 'CategoryTranslation.orm.xml' for class 'App\Application\Sonata\ClassificationBundle\E
  ntity\CategoryTranslation'.

据我所知,这个新实体应该使用注解进行映射,而不是 XML。我做错了什么?

编辑:这是我的教义.yaml 文件的内容:

parameters:
    # Adds a fallback DATABASE_URL if the env var is not set.
    # This allows you to run cache:warmup even if your
    # environment variables are not available yet.
    # You should not need to change this value.
    env(DATABASE_URL): ''

doctrine:
    dbal:
        # configure these for your database server
        driver: 'pdo_mysql'
        server_version: '5.6'
        charset: utf8

        # With Symfony 3.3, remove the `resolve:` prefix
        url: '%env(resolve:DATABASE_URL)%'

        types:
            json: Sonata\Doctrine\Types\JsonType
    orm:
        auto_generate_proxy_classes: '%kernel.debug%'
        naming_strategy: doctrine.orm.naming_strategy.underscore
        auto_mapping: true
        mappings:
            App:
                is_bundle: false
                type: annotation
                dir: '%kernel.project_dir%/src/Entity'
                prefix: 'App\Entity'
                alias: App
            SonataMediaBundle: ~
            ApplicationSonataMediaBundle: ~
        metadata_cache_driver: array
        result_cache_driver: array
        query_cache_driver: array

【问题讨论】:

  • 看起来mapping configuration 使用了错误的类型。您的config/ 目录中是否有文件doctrine.yaml,或者您可以在配置中搜索教义部分并显示它吗?您也可以尝试bin/console debug:config doctrine 找出实际配置
  • @dbrumann 感谢您的评论。我已将doctrine.yaml 的内容添加到问题中。

标签: php symfony doctrine translation sonata


【解决方案1】:

我猜实体的奏鸣曲映射配置是 xml。 通过在您的目录App\Application\Sonata\ClassificationBundle\Entity\CategoryTranslation 中创建一个新的奏鸣曲实体,它将使用您在doctrine.yaml 中定义的映射配置:

SonataMediaBundle:~

ApplicationSonataMediaBundle: ~

其中使用默认的(xml)。只有在您的 App 映射中的映射(即在您的目录 dir: '%kernel.project_dir%/src/Entity' 中)才会使用您指定的注解。

您可以为您的奏鸣曲捆绑包指定type: annotation(但它可能会使捆绑包中的现有实体失败,因此不推荐,但要测试)或为此特定实体生成 xml 映射文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 2013-09-18
    相关资源
    最近更新 更多