我正在构建一个服务(称为“dynamic_query”),我用它来将所有实体公开给REST API,这样如果我有一个像这样的实体图:
[大陆 - (有很多) - >国家 - (有很多) - >城市]
我可以通过网址获取非洲国家(JSON列表):
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() **及其路径**并使其在我的捆绑包中的每个实体中都可用,所以无论何时我访问:
http://www.example.com/entity/api/?arg_1=val_1&arg_2=val_2&arg_n=val_n
我在apiAction()中显示了完全相同的逻辑,除了$ entity_name和路由名称/ uri应该动态改变以适应api查询
答案 0 :(得分:1)
除了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,但我认为您可以根据自己的情况轻松调整此代码。但是你需要相互控制。