在Symfony中自定义i18n路由

kub*_*lav 5 routing internationalization symfony

我正在使用JMS\I18nRoutingBundle,Gedmo\Translatable而且Gedmo\Sluggable.具有默认位置的路由也可以工作,但其他语言环境无需翻译slug.我的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
Run Code Online (Sandbox Code Playgroud)

当我设置这样的路线时:

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

这条路线有效
example.cz/category/slug-in-czech
example.com/category/slug-in-czech

但是我希望获得example.com/category/slug-in-english引发404异常的工作object not found.

jku*_*vic 1

在您的控制器中,您必须覆盖实体存储库中使用的方法:

/**
 * @Template
 * @ParamConverter(
 *     "category",
 *     class = "AcmeSiteBundle:Category",
 *     options = {
 *         "repository_method" = "findByTranslatedSlug"
 *     }
 *  )
 */
public function detailAction(Category $category)
{}
Run Code Online (Sandbox Code Playgroud)

 

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')
            ->setParameters($slug);

        $query = $qb->getQuery();
        // set the translation query hint
        $query->setHint(
            \Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER,
            'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker'
        );

        return $query->getOneOrNullResult();
    }
}
Run Code Online (Sandbox Code Playgroud)