我对symfony很陌生,花了好几个小时试图寻找解决方案。 我正在建立一个多语言网站,其中页面slugs是不同的。 例如:
www.mywebsite.com/products EN将是www.mywebsite.com/produits FR但两者都使用相同的控制器
我必须建立一条动态路线,这就是我做的方式我很确定我能做得更好,你能帮助我吗?
<?php
namespace App\Controller;
use Symfony\Component\HttpFoundation\Response;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
class websiteController{
public function __construct(){
$this -> route = array(
'about' => 'page_about',
'contact' => 'page_contact',
);
}
/**
* @Route("/{page}", name="page")
*/
public function pageAction($page)
{
if($page == $this -> route['about']){
return new Response('<html><body>page about</body></html>');
}
if($page == $this -> route['contact']){
return new Response('<html><body>page contact</body></html>');
}
}
}
?>
答案 0 :(得分:0)
有一个名为BeSimpleI18nRoutingBundle的路由国际化的捆绑包,但它现在可用于symfony 4 。
使用核心symfony,您可以为每个控制器使用多个路由,这将具有默认值的{_locale}
参数,这里的问题是两个不同的URL将返回同一页面。
例如 / test 与 / test / en
相同这可能会导致SEO问题
这里注释如果你想实现这个方法会是什么样子
/**
* @Route("/test/{_locale}", defaults={"_locale"="en"}, requirements={"_locale":"en"}, name="default_en")
* @Route("/δοκιμή/{_locale}", defaults={"_locale"="el"}, requirements={"_locale":"el"}, name="default_el", options = {"utf8": true})
* @Route("/tester/{_locale}", defaults={"_locale"="fr"}, requirements={"_locale":"fr"}, name="default_fr")
*/
public function test($_locale)
{
return new Response("Your current locale is : $_locale");
}
另一种选择是创建一个应用逻辑的路由服务。 这是一个例子。
这将是处理所有路径的控制器
namespace App\Controller;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use App\Service\Router;
class RouterController extends Controller {
/**
* @Route("/{path}", name="router", requirements={"path" = ".+"})
*/
public function router($path,Request $request,Router $router) {
$result=$router->handle($path);
if($result){
$result['args']['request']=$request;
return $this->forward($result['class'], $result['args']);
}
throw $this->createNotFoundException('error page not found!');
}
}
此Controller Action依赖于名为路由器的服务,因此您必须创建一个路由器服务,该服务将返回一个数组(您可以将其更改为返回自定义对象),其中包含键class 和 args ,用于将请求转发给控制器操作。
/src/Service/Router.php
在这里,您应该实现一个名为handle
的函数,您可以对其应用任何逻辑
这是一个基本的例子
namespace App\Service;
class Router
{
public function handle($path)
{
switch ($path) {
case "test":
return [
"class" => "App\Controller\TestController::index",
"args" => [
"locale" => 'en'
]
];
case "tester":
return [
"class" => "App\Controller\TestController::index",
"args" => [
"locale" => 'fr'
]
];
default:
return false;
}
}
}
上面的代码会将请求转发给TestController::index
函数,并将locale
变量作为参数添加到该函数中,并且还会包含Request
对象
您可以将路由存储在yaml文件或数据库或您喜欢的任何其他位置。您可以操纵$path
变量来提取有关 id ,页面等的信息。