8

一言で言えば

Symfony2 / Doctrine2アプリを作成していて、YAMLを使用してStofDoctrineExtensionsBundleによって提供されるTranslatable拡張機能をインストールして構成しましたが、追加の翻訳テーブルは生成されず、翻訳可能なプロパティを持つエンティティを操作しようとすると、次の例外がスローされます。

クラス「Gedmo\Translatable \ Entity\Translation」の「/var/www/my-project/vendor/gedmo/doctrine-extensions/lib/Gedmo/Translatable/Entity/Translation.orm.yml」という名前のマッピングファイルが見つかりません。

さらに詳細に

StofDoctrineExtensionsBundleによって提供されるSymfony2/Doctrine2アプリケーションでTranslatable拡張機能を機能させようとしていますが、入手可能なドキュメントのほとんどは、主に構成用のアノテーションの使用を対象としていますが、それは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を実行してエンティティクラスを生成し、localeプロパティとsetterを手動で追加しました。

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

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

を実行した後php app/console doctrine:schema:update --force、私の記事テーブルはその関連付けとともに作成されますが、翻訳に関連するものは何もありません(このためにテーブルが作成されることになっていると思います...)

次に、翻訳可能なエンティティを操作すると、例外が発生します。

クラス「Gedmo\Translatable \ Entity\Translation」の「/var/www/my-project/vendor/gedmo/doctrine-extensions/lib/Gedmo/Translatable/Entity/Translation.orm.yml」という名前のマッピングファイルが見つかりません。

例外が参照しているYAMLファイルは、それが探しているパスに存在しません。また、他の場所でも見つけることができませんでした。

私がどこで間違っているのかについて誰かが何か考えを持っていますか?

更新:さらに調査した後...

実行php app/console doctrine:mapping:infoすると、すべてのエンティティが表示され、翻訳に関連するものは何も表示されませんが、ファイルのgedmo_translatable:一部を更新してからコマンドを再度実行するように変更すると、次のように表示されます。app/config/config.ymltype: 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 に答える