我希望用Symfony完成多语言网站。所以我需要添加类似的东西:
# app/config/routing.yml
contact:
path: /{_locale}
defaults: { _locale: "pl" }
requirements:
_locale: pl|en
但是我不想在我定义的每条路线上重复这个,所以我提出了解决方案:
# app/config/config.yml
parameters:
locale.available: pl|en
locale.default: pl
<...>
router:
resource: "%kernel.root_dir%/config/routing.php" # note '.php'
<!-- language: lang-php -->
# app/config/routing.php
<?php
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;
use Symfony\Component\Yaml\Parser;
$configFile = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'routing.yml';
$yaml = new Parser();
try {
$routes = $yaml->parse(file_get_contents($configFile));
} catch (ParseException $e) {
printf("Unable to parse the YAML string: %s", $e->getMessage());
}
$collection = new RouteCollection();
foreach ($routes as $name => $def) {
$route = new Route($def['path']);
foreach (['defaults', 'requirements', 'options', 'host', 'schemes', 'methods', 'condition'] as $opt) {
$mtd = 'add'. ucfirst($opt);
if(isset($def[$opt])) $route->$mtd($def[$opt]);
}
$collection->add($name, $route);
}
$collection->addRequirements(['_locale' => "%locale.available%"]);
$collection->addDefaults(['_locale'=>"%locale.default%"]);
return $collection;
?>
# app/config/routing_dev.yml
<...>
_main:
resource: routing.php
尽管如此,我对Symfony2(现在是3)还不熟悉,所以我想知道......有没有更好的方法来完成所有路由的附加路由配置?也许有更灵活或更多的“正确”和#34;在Symfony做这些事情的方法?或者我应该挂钩一些现有的机制?
答案 0 :(得分:2)
您可以使用扩展默认路由加载器的自定义路由加载器。有关详细信息,请参阅此处:
http://symfony.com/doc/current/cookbook/routing/custom_route_loader.html
例如,如果你想支持yml,xml和注释,你需要扩展Symfony \ Component \ Routing \ Loader \ YamlFileLoader,Symfony \ Component \ Routing \ Loader \ XmlFileLoader和Sensio \ Bundle \ FrameworkExtraBundle \ Routing \ AnnotatedRouteControllerLoader将您拥有的逻辑合并到加载方法中,您需要更改
sensio_framework_extra.routing.loader.annot_class.class,routing.loader.yml.class and routing.loader.xml.class
参数指向新的类。
定义自己的route_loader似乎不那么狡猾的解决方案