FOSRestBundle中的路由是如何工作的


How do routes in FOSRestBundle work?

有人能清楚地解释如何使用FOSRest为REST请求配置路由吗?每个教程似乎都有不同的做法。

我的控制器:

<?php
namespace Data'APIBundle'Controller;
use Symfony'Bundle'FrameworkBundle'Controller'Controller;
use Symfony'Component'HttpFoundation'Request;
class DatasetController extends Controller{
 protected function postDatasetAction(Request $request){
  //Query here
}

URL应该是这样的:Symfony/web/app_dev.php/api/dataset。所以我认为路由应该是这样。。。

app/config/routes.yml

data_api:
  resource: "@DataAPIBundle/Resources/config/routing.yml"
  prefix: /api
  type: rest

而且。。。。

Data/APIBundle/Resources/config/routing.yml

data_query:
  type: rest
  pattern:  /dataset
  defaults: {_controller: DataAPIBundle:Dataset:datasetAction, _format: json }
  requirements:
     _method: POST

请按照下一个URL阅读官方文档:http://symfony.com/doc/master/bundles/FOSRestBundle/index.html

要从这个捆绑包开始,我建议遵循单个restful控制器文档:http://symfony.com/doc/master/bundles/FOSRestBundle/5-automatic-route-generation_single-restful-controller.html

你也会发现明显的例子(https://github.com/liip/LiipHelloBundle)关于这个捆绑包能提供什么。


你发布的片段中有几件事引起了我的注意:

控制器方法的可见性受到保护,而它应该是公共的(http://symfony.com/doc/current/book/controller.html)

public function postDatasetAction(Request $request) {
     // your code
}

为配置路由而创建的"routing.yml"文件应包含上述控制器方法的名称(postDatasetAction而不是DatasetAction(:

# routing.yml
data_query:
    type: rest
    pattern:  /dataset
    defaults: {_controller: DataAPIBundle:Dataset:postDatasetAction, _format: json }
    requirements:
        _method: POST

请在下面找到一个设置路线的示例,如:

get_items获取任何ANY/items。{json}

# config.yml
fos_rest:
    allowed_methods_listener: true
    format_listener:
        default_priorities: ['json', html, '*/*']
        fallback_format: json
        prefer_extension: true
    param_fetcher_listener: true
    routing_loader:
        default_format: json
    view:
        formats:
            json: true
        mime_types:
            json: ['application/json', 'application/x-json']
        force_redirects:
            html: true
        view_response_listener: force

# routing.yml
categories:
    type:     rest
    resource: Acme'DemoBundle'Controller'ItemController

<?php
namespace Acme'DemoBundle'Controller
use FOS'RestBundle'Request'ParamFetcher;
use FOS'RestBundle'Controller'Annotations as Rest;
class ItemController 
{
    /**
     * Get items by constraints
     *
     * @Rest'QueryParam(name="id", array=true, requirements="'d+", default="-1", description="Identifier")
     * @Rest'QueryParam(name="active", requirements="'d?", default="1", description="Active items")
     * @Rest'QueryParam(name="from", requirements="'d{4}-'d{2}-'d{2}", default="0000-00-00", description="From date")
     * @Rest'QueryParam(name="to", requirements="'d{4}-'d{2}-'d{2}", default="0000-00-00", description="End date")
     * @Rest'QueryParam(name="labels", array=true, requirements="'d+", default="-1", description="Labels under which items have been classifed")
     *
     * @Rest'View()
     *
     * @param  ParamFetcher                                          $paramFetcher
     */
    public function getItemsAction(ParamFetcher $paramFetcher) {
        $parameters = $paramFetcher->all();
        // returns array which will be converted to json contents by FOSRestBundle
        return $this->getResource($parameters);
    }
}

附言:您需要添加一个视图来将资源显示为HTML页面

您在控制器中缺少FOSRestbundle的路由部分:

protected function postDatasetAction(Request $request){
  //Query here
} // "post_dataset"      [POST] /dataset