symfony 4带有数组

时间:2018-01-23 21:24:48

标签: symfony routes

我对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>');
        }

    }
}
?>

1 个答案:

答案 0 :(得分:0)

有一个名为BeSimpleI18nRoutingBundle的路由国际化的捆绑包,但它现在可用于symfony 4

核心symfony实施

使用核心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 页面等的信息。