这是我最终决定要做的事情:
- 不管我想要什么,我为每个控制器操作定义了两条路由(参见下面的示例);
- 我扩展了 Symfony 的
RoutingExtension 以在使用 path 或 url 方法时自动选择正确的路线。
这是我的双路由配置的样子(注意双路由,第二个有+locale 后缀):
<?php
// src\AppBundle\Controller\DefaultController.php
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
class DefaultController extends Controller {
/**
* @Route("/", name="front_index")
* @Route("/{_locale}/", name="front_index+locale", requirements={"_locale": "\w{2,3}"})
* @return Response
*/
public function indexAction() {
return $this->render('test/domain-translation.html.twig');
}
}
这是我的RoutingExtension 重载:
<?php
// src\AppBundle\Twig\LocaleRoutingExtension.php
namespace AppBundle\Twig;
use AppBundle\Document\Domain;
use Symfony\Bridge\Twig\Extension\RoutingExtension;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Request;
class LocaleRoutingExtension extends RoutingExtension {
/** @var ContainerInterface */
protected $container;
/** @var Domain */
protected $domain;
/** @var Request */
protected $request;
public function setContainer(ContainerInterface $container) {
$this->container = $container;
$this->domain = $this->container->get('app.domain_service')->getDomain();
$this->request = $this->container->get('request_stack')->getMasterRequest();
}
protected function processNameAndParameters($name, $parameters) {
$nameWithLocale = $name . '+locale';
$routes = $this->container->get('router')->getRouteCollection();
$route = $routes->get($nameWithLocale);
if (array_key_exists('no-locale-filter', $parameters) && $parameters['no-locale-filter']) {
unset($parameters['no-locale-filter']);
return array('name' => $name, 'parameters' => $parameters);
}
if (isset($this->domain) && $this->domain->hasMultipleLocales() && isset($route)) {
$name = $nameWithLocale;
$locale = null;
if (!array_key_exists('_locale', $parameters)) {
if (isset($this->request)) {
$locale = $this->request->getLocale();
} else {
$locale = $this->domain->getDefaultLocale();
}
}
$parameters['_locale'] = $locale;
}
return array('name' => $name, 'parameters' => $parameters);
}
public function getPath($name, $parameters = array(), $relative = false) {
$processed = $this->processNameAndParameters($name, $parameters);
return parent::getPath($processed['name'], $processed['parameters'], $relative);
}
public function getUrl($name, $parameters = array(), $schemeRelative = false) {
$processed = $this->processNameAndParameters($name, $parameters);
return parent::getUrl($processed['name'], $processed['parameters'], $schemeRelative);
}
}
我希望这会有所帮助!