5

JMS\I18nRoutingBundleGedmo\Translatableおよびを使用してGedmo\Sluggableいます。デフォルトの場所を持つルートも同様に機能しますが、他のロケールは翻訳されたスラッグなしで機能します。私の i18n ルーティングには次の設定があります。

# Doctrine extensions
stof_doctrine_extensions:
    default_locale: %locale%
    translation_fallback: true
    orm:
        default:
            #…
            sluggable:      true
            translatable:   true
            loggable:       false
            #…

jms_i18n_routing:
    default_locale: cs_CZ
    locales: [cs_CZ, en_US]
    strategy: custom
    hosts:
        cs_CZ: example.cz
        en_US: example.com
    redirect_to_host: true

次のようにルートを設定すると:

hw_category:
    pattern: /category/{slug}
    defaults: { _controller: AcmeSiteBundle:Category:detail }
/**
 * @Template
 */
public function detailAction(Category $category)
{}

このルートは機能します
example.cz/category/slug-in-czech
example.com/category/slug-in-czech

example.com/category/slug-in-englishしかし、私は 404 例外をスローする作業を取得したいと考えていますobject not found

4

4 に答える 4

1

ご覧のとおり、ParamConverter を使用してカテゴリを自動的に取得しています。

データベースに既存のスラッグがある場合slug-in-english、doctrine はそれを取得することを拒否します。

その時点で、 TranslatableListenerが EntityManager に追加されていない可能性があります。

$translatableListener = new \Gedmo\Translatable\TranslationListener();
$translatableListener->setTranslatableLocale('en_us');
$em->addEventSubscriber($translatableListener);

StofDoctrineExtensionsBundleを使用している場合:

stof_doctrine_extensions:
    default_locale: en_US
    orm:
        default:
            # ...
            translatable: true
于 2013-06-12T10:39:34.987 に答える
1

私は同じ問題を抱えていました.jkucharovicが提案したように、Doctrine ParamConverterを使用してリクエストパラメータをオブジェクトに変換できます

データベースからオブジェクトをフェッチするために、Doctrine コンバーターはデフォルトで find() メソッドを使用します。しかし、Translatable を使用しているため、複数のテーブルを使用しているため、翻訳を管理するには十分ではありません。そのため、独自のテーブルを定義する必要があります。これが findByTranslatedSlug です。

/**
 * @Template
 * @ParamConverter(
 *     "category",
 *     class = "AcmeSiteBundle:Category",
 *     options = {
 *         "id" = "slug",
 *         "repository_method" = "findByTranslatedSlug"
 *     }
 *  )
 */
public function detailAction(Category $category)
{}

ParamConverter パラメーターに関する詳細:

  • 最初のパラメーター「category」は、メソッド引数の名前を参照します (ここでは $category )
  • 「id」オプションは、カスタマイズされたリポジトリ メソッド (findByTranslatedSlug())に渡すルート プレースホルダー (ここでは{slug} ) を参照します。このオプションを設定しないと、PDO 例外がスローされます。

 

namespace Acme\Bundle\SiteBundle\Entity;

use Doctrine\ORM\EntityRepository;

class CategoryRepository extends EntityRepository
{
    public function findByTranslatedSlug($slug)
    {
        $qb = $this->createQueryBuilder('c')
            ->where('c.slug = :slug')
            ->setParameter('slug',$slug);

        $query = $qb->getQuery();
        // set the translation query hint
        $query->setHint(
            \Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER,
            'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker'
        );
        // If you need to set manually the locale to en_US, you can set this query hint
        //$query->setHint(\Gedmo\Translatable\TranslatableListener::HINT_TRANSLATABLE_LOCALE, 'en_US');

        return $query->getOneOrNullResult();
    }
}

これが役立つことを願っています

ドキュメント:

于 2014-09-30T16:04:27.597 に答える