2013-06-12 15 views
5

Używam JMS\I18nRoutingBundle,i Gedmo\Sluggable. Trasy z domyślnymi lokalizacjami również działają, ale inne ustawienia lokalne działają bez przetłumaczonego pliku. Moja i18n routingu mają następujące ustawienia:Niestandardowe trasowanie i18n w Symfony

# 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 

Kiedy skonfigurować trasę tak:

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

This trasy działa
example.cz/category/slug-in-czech
example.com/category/slug-in-czech

Ale chcę dostać praca example.com/category/slug-in-english, która zgłasza 404 wyjątek object not found.

Odpowiedz

1

w kontroler, trzeba zastąpić metodę wykorzystywaną w repozytorium jednostki:

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

 

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(); 
    } 
} 
1

Jak widzisz, korzystasz z ParamConvertera, aby automatycznie pobrać swoją kategorię.

Jeśli slug-in-english jest istniejącym ślimakiem w bazie danych, ale doktryna odmawia jego pobrania.

Prawdopodobnie w tym momencie nie ma już dodanego do Twojego obiektu EntityManager TranslatableListener.

Przykład:

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

Jeśli używasz StofDoctrineExtensionsBundle:

stof_doctrine_extensions: 
    default_locale: en_US 
    orm: 
     default: 
      # ... 
      translatable: true 
+0

Gdzie powinienem załączyć 'TranslatableListener' - w którym pliku? – kuboslav

+0

używasz StofDoctrineExtensionsBundle? – nifr

+0

zaktualizowałem moją odpowiedź :) – nifr

1

miałem ten sam problem i jak sugeruje jkucharovic, można użyć Doctrine ParamConverter konwertować parametry żądania do obiektu

Aby pobrać obiekt z bazy danych, Nauki konwerter używa domyślnie metody find(). Ale ponieważ używamy formatu Translatable, a więc wielu tabel, nie wystarczy zarządzać tłumaczeniami, dlatego musimy zdefiniować nasze własne. Nadchodzi findByTranslatedSlug.

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

Kilka szczegółów na temat parametrów ParamConverter:

  • Pierwszy parametr "kategoria" (tutaj $ kategoria) odnosi się do nazwy metody argumentu "id" opcja
  • odnosi się do symbolu zastępczego trasy, który chcesz przekazać (tutaj {slug}) do niestandardowej metody repozytorium (findByTranslatedSlug()). Bez ustawienia tej opcji spowodowałoby to wyjątek 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(); 
    } 
} 

Mam nadzieję, że to może pomóc

Dokumenty: