8

简而言之

我正在编写一个 Symfony2 / Doctrine2 应用程序,并使用 YAML 安装和配置了 StofDoctrineExtensionsBundle 提供的可翻译扩展,但是没有生成额外的翻译表,并且在尝试使用具有可翻译属性的实体时抛出以下异常:

没有找到名为“/var/www/my-project/vendor/gedmo/doctrine-extensions/lib/Gedmo/Translatable/Entity/Translation.orm.yml”的类“Gedmo\Translatable\Entity\Translation”的映射文件。

更详细

我试图让 Translatable 扩展在StofDoctrineExtensionsBundle提供的 Symfony2 / Doctrine2 应用程序中工作,但是我能找到的大多数可用文档主要针对配置注释的使用,但我将使用 YAML,因为那是我是如何配置其他一切的。

我的配置

我已将以下内容添加到我的composer.json文件中并运行了composer update命令:"stof/doctrine-extensions-bundle": "dev-master"并且捆绑包已在我的app/AppKernel.php文件中注册。

我的app/config/config.yml文件具有以下配置:

doctrine:
  orm:
    auto_generate_proxy_classes: %kernel.debug%
      auto_mapping: true        
      mappings:
        gedmo_translatable:
          type: yml
          prefix: Gedmo\Translatable\Entity
          dir: "%kernel.root_dir%/../vendor/gedmo/doctrine-extensions/lib/Gedmo/Translatable/Entity"
          alias: GedmoTranslatable
          is_bundle: false

stof_doctrine_extensions:
  default_locale: en_GB
  translation_fallback: true
  orm:
    default:
      timestampable: true
      translatable: true

然后我在 YAML 中定义了一个实体:

Foo\ContentBundle\Entity\Article:
  type: entity
  repositoryClass: Foo\ContentBundle\Repository\ArticleRepository
  table: article
  gedmo:
    translation:
      locale: locale
  id:
    id:
      type: integer
      generator: { strategy: AUTO }
  fields:
    name:
      type: string
      length: 64
      gedmo:
        - translatable
    content:
      type: text
      gedmo:
        - translatable
    # ... #
  oneToMany:
    # ... #

然后我运行了控制台命令php app/console doctrine:generate:entities FooContentBundle来生成实体类,并手动添加了语言环境属性和设置器:

class Article
{
    /* ... */
    private $locale;

    public function setTranslatableLocale($locale)
    {
        $this->locale = $locale;
    }
    /* ... */
}

运行后php app/console doctrine:schema:update --force,我的文章表与其关联一起创建,但与翻译无关(我假设应该为此创建一个表......)

然后,当使用可翻译的实体时,我遇到了异常:

没有找到名为“/var/www/my-project/vendor/gedmo/doctrine-extensions/lib/Gedmo/Translatable/Entity/Translation.orm.yml”的类“Gedmo\Translatable\Entity\Translation”的映射文件。

异常引用的 YAML 文件在它正在查找的路径中不存在,我也无法在其他任何地方找到它。

有人对我哪里出错有任何想法吗?

更新:经过进一步调查...

运行php app/console doctrine:mapping:info显示我的所有实体,没有任何与翻译相关的内容,但是,如果我更新文件的gedmo_translatable:一部分app/config/config.yml并更改type: ymltype: annotation然后再次运行命令,我会列出以下内容:

[OK]   Gedmo\Translatable\Entity\MappedSuperclass\AbstractTranslation
[OK]   Gedmo\Translatable\Entity\Translation
[OK]   Gedmo\Translatable\Entity\MappedSuperclass\AbstractPersonalTranslation

此时,我可以更新我的架构,并且我有一个新ext_translations表。但是,在使用我的实体时,没有任何东西被插入其中,大概是因为它现在期望通过注释而不是 YAML 进行配置,将我的配置更改回type: yml开始再次抛出异常,正如预期的那样。

4

1 回答 1

5

在尝试了文档建议不起作用的事情之后,即将注释和 YAML 配置混合在同一个包中,看起来我有一些工作。整个事情感觉像是一个错误或一个不完整的实现,但是我可能做错了什么。这就是工作...

在 中设置以下内容app/config/config.ymldoctrine.orm.mappings.gedmo_translatable.type: annotation

如我的原始问题中所述,在我的 YAML 模式定义中设置可翻译配置,以及我的类文件中的注释:

/* ... */
use Gedmo\Mapping\Annotation as Gedmo;
/* ... */
class Article
{
    /* ... */

    /**
     * @Gedmo\Translatable
     * @var string $name
     */
    private $name;

    /**
     * @Gedmo\Locale
     */
    private $locale;

    public function setTranslatableLocale($locale)
    {
        $this->locale = $locale;
    }
    /* ... */
}

完成此操作后,将创建附加表,并在持久化实体时将翻译插入其中。

于 2012-10-19T13:50:19.830 回答