我已经开始为使用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
。
答案 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}
-------------------------- -------- -------- ------ ----------------------------------------