2016-04-28 7 views
0

オプションロケール:symfonyのローカライズされたルート - 私は適切なアクションを提供するために、以下のURLを希望

  • /- indexAction
  • /FR - indexAction
  • /fooの - detailsAction(スラグ= FOO)
  • /FR/FOO - Iは、次のアクションメソッドを追加したdetailsAction(スラグ= FOO)

/** 
* @Route("/{_locale}", name="home", defaults={"_locale": ""}, requirements={"_locale": "fr|es"}) 
*/ 
public function indexAction() { 
    ... 
} 

/** 
* @Route("/{_locale}/{slug}", name="details", defaults={"_locale": ""}, requirements={"_locale": "fr|es"}) 
*/ 
public function detailsAction($slug) { 
    ... 
} 

/、/ fr、/ fr/fooに行くとうまくいきます。しかし、私が/ fooに行くと、それは一致するルートを見つけることができません。もし誰かが私にこのことを示すことができたら、私はそれを感謝します。

私は理想的には、特定のアクションメソッドに複数の@Routeアノテーションを追加しなくても、これを実現したいと考えています。そのようにして、UrlGeneratorを使用して、_localeパラメータを渡すかどうかにかかわらず、ローカライズされたローカライズされたルートを生成するために同じ名前を指すことができます。

+1

https://github.com/schmittjoh/JMSI18nRoutingBundleを使用して疲れましたか?これはあなたが必要とするものとまったく同じようです。 – Terenoth

+0

ありがとうございますが、自分のフレームワークを使用していて、特定のSymfonyコンポーネントのみを使用しています。私は彼らがアイデアを得るために何をしたかを見ていきます。 – nfplee

答えて

0

私のソリューションはややハッキリですが、これを動作させることができました。最初に、パスの{_locale}部分、既定値、要件を上記のルートから削除しました。私は私のルートを作成したとき

は、その後、私は言った:それは簡単に一つの場所に設定することができるよう

$routes = new RouteCollection(); 

// Load the routes 
... 

$routes->addPrefix('/{_locale}', ['_locale' => ''], ['_locale' => '|fr|es']); 

これは、自動的にルートにローカライズビット(上記削除)を追加します。私は自分の型にRouteCollectionを変更し、以下:

use Symfony\Component\Routing\RouteCollection as BaseRouteCollection; 

class RouteCollection extends BaseRouteCollection { 
    public function addPrefix($prefix, array $defaults = [], array $requirements = []) { 
     foreach ($this->all() as $route) { 
      $route->setPath($prefix . rtrim($route->getPath(), '/')); 
      $route->addDefaults($defaults); 
      $route->addRequirements($requirements); 
     } 
    } 
} 

これは、ローカライズされたホームページのルートは、例えばスラッシュで終わっていない確認します/ fr /。

は最後に、私は次のようにルートクラスをオーバーライドする必要がありました:

use ReflectionProperty; 
use Symfony\Component\Routing\Route as BaseRoute; 

class Route extends BaseRoute { 
    public function compile() { 
     // Call the parent method to get the compiled route 
     $compiledRoute = parent::compile(); 

     // Override the regex property 
     $property = new ReflectionProperty($compiledRoute, 'regex'); 
     $property->setAccessible(true); 
     $property->setValue($compiledRoute, str_replace('^/', '^/?', $compiledRoute->getRegex())); 

     return $compiledRoute; 
    } 
} 

これは特にハックですが、ヒープに多くのコードを追加することからあなたを救うん。最初のスラッシュがオプションであるため、/ foo urlが動作するように正規表現を置き換えるだけです。注意:RouteCollectionがSymfony Routeクラスではなく、このクラスのコレクションであることを確認する必要があります。

これが役に立ちます。