我现在正在使用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的手动路由配置文档,但由于我花了一些时间尝试这样做,我来这里寻求帮助:)
答案 0 :(得分:1)
如果要手动定义路由,只需将路由添加到现有路由配置即可。具体取决于您如何处理路由配置:注释,yaml或xml。
在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) { ... }
将此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,然后进行计算!