使用FOSRestBundle的Symfomy2手动路由定义

时间:2014-03-24 00:04:40

标签: php rest symfony fosrestbundle

我现在正在使用FOSRestBundle在Symfony应用程序中构建REST API。现在的想法是列出一些地点(酒店,餐馆......),我设法用FOSRestBundle配置自动路线,如:

/ api / locations,/ api / locations / {id},/ api / locations / {name} / detail

使用此控制器:

class LocationController extends FOSRestController implements ClassResourceInterface
{

/**
 * GET /locations 
 *
 * @return Array
 *
 */
public function cgetAction()
{
    $locations = $this->getDoctrine()
              ->getManager()
              ->getRepository('VisitBILocationsBundle:Location')
              ->findAll(); 

    if (!$locations) {
        return array(
            'locations' => $locations,
            'status' => 1
        );
    }

    return array(
            'locations' => $locations,
            'status' => 0
        );
}

/**
 * GET /locations/{locationId} 
 *
 * @return Array
 *
 */
public function getAction($id)
{
    $location = $this->getDoctrine()
              ->getManager()
              ->getRepository('VisitBILocationsBundle:Location')
              ->findBy(array('id' => $id));

    if (!$location) {
        return array(
            'location' => $location,
            'status' => 1
        );
    }

    return array(
            'location' => $location,
            'status' => 0
    );       
}

/**
 * GET /locations/{name}/detail 
 *
 * @return Array
 */
public function getDetailAction($name)
{

    $detail = $this->getDoctrine()
             ->getManager()
             ->getRepository('VisitBILocationsBundle:LocationDetail')
             ->findBy(array('name' => $name));

    if (!$detail) {
        return array(
            'locationDetail' => $detail,
            'status' => 1
        );
    }

    return array(
            'locationDetail' => $detail,
            'status' => 0
    );      
}


}

我一直在努力解决这个问题,但是有谁知道我应该如何继续生成这样的自定义网址:

/ API /位置/附近/ {纬度} / {经度}

我的想法是提供自己的纬度和经度,后端将计算并提供最接近我的位置。

当然,我已经查看了FOSRestBundle的手动路由配置文档,但由于我花了一些时间尝试这样做,我来这里寻求帮助:)

2 个答案:

答案 0 :(得分:1)

如果要手动定义路由,只需将路由添加到现有路由配置即可。具体取决于您如何处理路由配置:注释,yaml或xml。

选项1:YAML

routing.yml文件(例如:src/Vendor/MyBundle/Resources/config/routing.yml)中添加以下内容:

location_nearby:
    pattern:  /api/locations/nearby/{latitude}/{longitude}
    defaults: { _controller: "MyBundle:Location:nearby" }
    requirements:
        _method: GET

LocationController中的此方法相对应:

public function nearbyAction($latitude, $longitude) { ... }

选项2:注释

将此use语句添加到Controller文件中:

use FOS\RestBundle\Controller\Annotations\Get;

然后在控制器方法上面定义路由:

/**
 * Return a nearby location
 * @Get("/api/locations/nearby/{latitude}/{longitude}")
 */
public function nearbyAction($latitude, $longitude) { ... }

答案 1 :(得分:1)

好的,这是如何继续,对我来说很好:

我使用注释系统路由/位置/附近/ {纬度} / {经度}

/**
 * Return a nearby location
 * @Get("/locations/nearby/{latitude}/{longitude}", requirements={"latitude" = "[-+]?(\d*[.])?\d+", "longitude" = "[-+]?(\d*[.])?\d+"})
 */
public function nearbyAction($latitude, $longitude) {...}

然后我必须用requirements={"latitude" = "[-+]?(\d*[.])?\d+", "longitude" = "[-+]?(\d*[.])?\d+"}

指定浮点数

控制器仍会将这些解释为字符串:“64.1333”,我只需要在控制器中使用它:

floatval($latitude)

将url参数设为float,然后进行计算!