2017-02-17 5 views
1

Я строй службы (так называемой «dynamic_query»), который я использую, чтобы выставить все объекты к REST API, так что если у меня есть схема сущности, как эта:Включить одно и то же действие во всех контроллерах с динамическим маршрутом в Symfony?

[континент - (есть много) -> страна - (есть много) -> город]

я могу получить список стран (JSON), которые находятся в Африке скажем через URL:

http://www.example.com/country/api/?continent=africa

И даже для косвенных у связанных лиц, я все еще могу получить результаты: , например, перечислить все города, которые принадлежат странам, расположенным в Европе:

http://www.example.com/city/api/?continent=europe

Служба готова и апробирована, вот как я использую он в контроллере города в качестве примера:

/** 
* City controller. 
* 
* @Route("city") 
*/ 
class CityController extends Controller 
{ 
    /** 
    * 
    * @Route("/api/", name="city_api",options = { "expose" = true }) 
    * @Method("GET") 
    * 
    */ 
    public function apiAction(Request $request) 
    { 

     $conditions=$request->query->all(); 

     $results=$this->get("app.dynamic_query") 
         ->narrow("city",$conditions); 

     return new Response($results); 
     } 
} 

Что я ищу прямо сейчас, чтобы найти способ «тиражировать» этот apiAction() ** с ** маршрут и сделать его доступный в каждом ntity в моей пачке, так что всякий раз, когда я достигаю:

http://www.example.com/entity/api/?arg_1=val_1&arg_2=val_2&arg_n=val_n

я получил точно такую ​​же логику, показанную выше в apiAction(), за исключением $ ENTITY_NAME и название маршрута/URI должен изменить динамически приспосабливать запрос апи

+3

Похоже, вы хотите, чтобы какой-то глобальный контроллер не находился в префиксе маршрута «город». В этом контроллере вы можете настроить маршрут с переменными частями, например '/ {entity}/api' для метода GET. Затем введите оператор switch или что-то, чтобы получить имя объекта на основе маршрутизации маршрута и изменить часть FROM из dql для использования этого имени сущности. – mickadoo

ответ

0

в дополнение к mickadoo комментария, в моем случае это то, что я использую, чтобы сделать это:

routing.yml:

list_entities: 
    path:  /admin/list/{class}/{page} 
    defaults: { _controller: AdminBundle:Admin:listEntities, page : 1 } 
    requirements: 
     methods: GET 
     class: region|department|city|user|type|category|offer|report|comment 
     page: \d+ 

AdminController:

class AdminController extends Controller{ 

    private $entities_bundle = array('region' => 'LocalizationBundle', 
            'department' => 'LocalizationBundle', 
            'city' => 'LocalizationBundle', 
            'user' => 'MainBundle', 
            'type' => 'MainBundle', 
            'category' => 'MainBundle', 
            'offer' => 'MainBundle', 
            'report' => 'MainBundle', 
            'comment' => 'MainBundle'); 

    private $entity_entities = array('region' => 'regions', 
            'department' => 'departments', 
            'city' => 'cities', 
            'user' => 'users', 
            'type' => 'types', 
            'category' => 'categories', 
            'offer' => 'offers', 
            'report' => 'reports', 
            'comment' => 'comments'); 

... 

public function listEntitiesAction($class, $page = 1){ 

    $em = $this->getDoctrine()->getManager(); 
    $entities = $em->getRepository($this->entities_bundle[$class].":".ucfirst($class))->findPaginateListForAdmin(30, $page); 

    //Your logic 

    return $this->render('AdminBundle:Admin:list_'.$this->entity_entities[$class].'.html.twig', array('parameters' => $parameters)); 


} 

Это не для REST API, но я думаю, что вы можете адаптировать этот код легко для вашего случая. Но вам нужен взаимный контроллер.

Смежные вопросы