symfony2 routing,来自数据库的可选前缀

时间:2015-12-10 15:27:07

标签: database symfony routing

基本上我想要实现的是:

我有这条道路:

http://SITENAME/dashboard

http://SITENAME/users

它们被映射到正确的控制器和动作:

/**
 * @Route("/dashboard")
 */
public function dashboardAction()
{
    // handle the request
}

/**
 * @Route("/users")
 */
public function usersAction()
{
    // handle the request
}

现在我想让这些其他路径映射到相同的控制器和操作:

http://SITENAME/ {的companyName} /仪表板

http://SITENAME/ {的companyName} /用户

companyName 是我检查db的名称(如果存在),如果不是则抛出NotFound异常。

这些路径只会为查询添加一些过滤器,基本上显示相同的数据结构。

我知道我可以制作其他动作并将它们放在之前的动作之后才能被抓住,但我会问是否有一些聪明的东西......这样的事情:

/**
 * @Route("/({companyName}/)dashboard")
 */
public function dashboardAction($companyName = null)
{
    // handle the request
}

其中companyName是可选的。

...谢谢

更新

正如Manolo所说,我已经尝试过类似的东西并且有效:

/**
 * @Route("/dashboard")
 * @Route("/{companyName}/dashboard")
 */
public function dashboardAction($companyName = null)
{
    // handle the request
}

但我认为有一种聪明的方法来处理它......

3 个答案:

答案 0 :(得分:2)

请看这个例子:http://symfony.com/doc/current/book/routing.html#routing-with-placeholders

// src/AppBundle/Controller/BlogController.php

// ...

/**
 * @Route("/blog/{page}", defaults={"page" = 1})
 */
public function indexAction($page)
{
    // ...
}

当路线中未定义页面时,它等于1.

但是这不适用于你的情况,因为你为同一个动作定义了两条路线:

/dasboard

/{companyName}/dashboard

所以你有两个选择:

<强> 1。为同一个动作定义两条路线(很奇怪)。

<强> 2。将您定义的路线更改为:/dashboard/{companyName}(更好)

然后,您可以使用相同的操作获取/dashboard/dashboard/{companyName}

答案 1 :(得分:0)

试试这样:

/**
 * @Route("/{companyName}/dashboard")
 */
public function dashboardAction($companyName = null)
{
    // handle the request
}

答案 2 :(得分:0)

我建议您使用@ParamConverter注释调用转换器将请求参数转换为对象。

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;

/**
 * @Route("/dashboard")
 * @Route("/({companyName}/)dashboard")
 * @ParamConverter("company", class="AcmeDemoBundle:Company", options={"name" = "companyName"})
 */
public function showAction(Company $company = null)
{

}

双路由定义允许默认的空公司值

希望这个帮助