如何使用FOSRestBundle为控制器的所有路由添加常规URI前缀?

时间:2017-02-25 17:36:37

标签: php symfony fosrestbundle

我已经开始为使用Symfony开发的应用程序实现控制器。这是我第一次尝试同时使用Symfony和PHP:我通常使用Java,以及JAX-RS或Spring。我跟着this tutorial

我的测试类如下,URI setCornerRadius按预期工作:

/tags

我希望仅使用注释,所有路由都自动带有“api”前缀,这样客户端就可以使用namespace AppBundle\Controller; use FOS\RestBundle\Controller\Annotations as Rest; use FOS\RestBundle\Controller\FOSRestController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; class TagController extends FOSRestController { /** * @Rest\Get("/tags") */ public function getTagsAction(Request $request) { $data = ['getTagsAction' => 'not implemented yet']; $view = $this->view($data, Response::HTTP_OK); return $view; } } 代替/tags

是否可以定义这样一个通用前缀,它会自动添加到所有函数的路径中?阅读the documentation,我认为这个Docblock的添加就是答案:

/api/tags

然而,this answer对另一个问题似乎给/** * @Rest\Prefix("/api") */ class TagController extends FOSRestController { ... } 注释带来了不同的含义。

此外,某处有路由缓存吗?未获取路线更改(至@Prefix而非tag)。我怀疑有一个动作可以通知框架更改路径或添加新控制器。

[编辑] tags确实有一个缓存。我相信控制台获取通过浏览器看似忽略的更改的原因是控制台假设开发环境,而通过浏览器访问通过/var/cache(而不是app.php)。事实证明,app_dev.php返回的路由集不同于php bin/console debug:router --env=prod(已删除环境规范)。清除缓存后,路由器或方法的更改在浏览器中生效:php bin/console debug:router

3 个答案:

答案 0 :(得分:5)

适合我:

use FOS\RestBundle\Controller\Annotations as Rest;

/**
 * Class UsersController
 * @package AppBundle\Controller
 * @Rest\Route("api/user")
 */
class UsersController extends FOSRestController implements ClassResourceInterface
{

    /**
     * Creates a new User
     *
     * @Rest\Post("/create")
     * @param Request $request
     * @return View
     */
    public function createAction(Request $request)
    {

然后当我访问/api/user/create时 - 一切正常。

答案 1 :(得分:3)

您可以在班级中使用路线注释,如:

/**
 * @Route("/api")
 */
class TagController extends FOSRestController
{
    ...

答案 2 :(得分:0)

在我的情况下,无法使用@Route。看起来这种方法在Symfony / FOSRestBundle的最新版本中已过时。但是,在我的情况下,@Prefix可以正常工作:

use FOS\RestBundle\Controller\Annotations as Rest;

/**
 * @Rest\Prefix("api")
 */
class CustomersController {
    public function getCustomersAction() {}
    public function newCustomersAction() {}
    public function getCustomerAction( $slug ) {}
    public function editCustomerAction( $slug ) {}
    public function removeCustomerAction( $slug ) {}
}

这最终导致console debug:router列出以下内容:

bash-4.4# bin/console debug:router
 -------------------------- -------- -------- ------ ---------------------------------------- 
  Name                       Method   Scheme   Host   Path                                    
 -------------------------- -------- -------- ------ ---------------------------------------- 
  new_customers              GET      ANY      ANY    /api/customers/new.{_format}            
  edit_customer              GET      ANY      ANY    /api/customers/{slug}/edit.{_format}    
  remove_customer            GET      ANY      ANY    /api/customers/{slug}/remove.{_format}  
  get_customers              GET      ANY      ANY    /api/customers.{_format}                
  get_customer               GET      ANY      ANY    /api/customers/{slug}.{_format}         
 -------------------------- -------- -------- ------ ----------------------------------------