Определение ручного маршрута Symfomy2 с помощью FOSRestBundle

Сейчас я использую FOSRestBundle для создания REST API в моем приложении Symfony. На данный момент идея состоит в том, чтобы перечислить некоторые места (гостиницы, рестораны...), мне удалось настроить автоматические маршруты с помощью 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
    );      
}


}

Я боролся с этим, но кто-нибудь знает, как мне приступить к созданию одного пользовательского URL-адреса, подобного этому:

/api/locations/nearby/{широта}/{долгота}

Идея состоит в том, что я бы предоставил свои собственные широту и долготу, а серверная часть вычислит и предоставит ближайшие ко мне местоположения.

Конечно, я просмотрел документацию FOSRestBundle для ручной настройки маршрута, но, поскольку я потратил некоторое время, пытаясь это сделать, я пришел сюда, чтобы попросить о помощи :)


person Tíbó    schedule 24.03.2014    source источник


Ответы (2)


Если вы хотите вручную определить маршрут, это должно быть так же просто, как добавить маршрут в существующую конфигурацию маршрутизации. Как именно вы это сделаете, зависит от того, как вы обрабатываете конфигурацию маршрутизации: аннотацию, 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 в файл контроллера:

use FOS\RestBundle\Controller\Annotations\Get;

а затем определите маршрут над методом контроллера:

/**
 * Return a nearby location
 * @Get("/api/locations/nearby/{latitude}/{longitude}")
 */
public function nearbyAction($latitude, $longitude) { ... }
person kunal    schedule 24.03.2014
comment
Да, я на самом деле попробовал второй вариант, как вы описали, и кое-что обнаружил: такой URL-адрес не работает (я всегда пробовал этот): api/locations/nearby/64.1333/21.9333, но это работает: api/locations/nearby/ khskhd/hjsldhs Что потребуется, чтобы передать широту и долготу в десятичном формате? - person Tíbó; 25.03.2014

Хорошо, вот как действовать, у меня отлично работает:

Я использую систему аннотаций для маршрутизации /locations/nearby/{широта}/{долгота}

/**
 * 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-адреса как с плавающей запятой, а затем выполнить мои расчеты!

person Tíbó    schedule 24.03.2014