如何使用FOSRestBundle单一化路径路径部分

时间:2016-05-04 13:44:56

标签: rest symfony fosrestbundle symfony-2.8

我有这个控制器(这里是一个片段)

/**
 * Class UserController
 * @package Belka\AuthBundle\Controller
 */
class UserController extends FOSRestController implements ClassResourceInterface
{
    /**
     * @View()
     *
     * @Route(requirements={"user"="\w+"})
     * @ParamConverter("user", converter="fos_rest.request_body")
     */
    public function postGlobaltokenAction(User $user)
    {
        ...
    }

自动生成路线:

  post_user_globaltoken      POST     ANY      ANY    /api/users/{user}/globaltokens.{_format}  

这是好的,除了我希望“globaltoken”单一化的事实。那可能吗?我找不到任何注释来调整它。我应该在route.yml

中对路线进行硬编码

1 个答案:

答案 0 :(得分:1)

我找到了两种方法:

使用个人Inflector

Symfony's documentation所示,您可以注册一个返回" globaltoken"的个人Inflector。永远是单数,而所有其他资源将是多元化的:

use Doctrine\Common\Util\Inflector;
use FOS\RestBundle\Util\Inflector\DoctrineInflector;
use FOS\RestBundle\Util\Inflector\InflectorInterface;

/**
 * Inflector class
 *
 */
class NoopInflector extends DoctrineInflector implements InflectorInterface
{
    public function pluralize($word)
    {
        if($word == "globaltoken")
            return $word;

        return parent::pluralize($word);
    }
}

services.yml:

services:
    belka.auth_bundle.util.inflector:
      class: Belka\AuthBundle\Util\NoopInflector

但我觉得这有点脏,因为我将来可能需要复数形式。

覆盖FOSRestBundle自动生成的路线

就这么简单!只需在正确的方法上添加@Route注释,即可完成!

/**
 * @View()
 *
 * @Route("/users/{user}/globaltoken", defaults={"_format" = "json"}, requirements={"user"="\w+"})
 *
 * @ParamConverter("user", converter="fos_rest.request_body")
 */
public function postAction(User $user)
{
}

现在,如果我致电php app/console debug:route,我就能得到我想要的东西:

post_user_globaltoken      POST     ANY      ANY    /api/users/{user}/globaltoken.{_format}