我正在编写一个简单的Symfony2 Web应用程序。我意识到我应用程序中的几乎每个控制器都执行相同的操作,但是在不同的对象上。我正在谈论标准的CRUD操作:创建,读取,更新和删除。我将使用“删除”操作作为示例
示例:
class CustomerController {
/**
* @Route("/customer")
* @Method("DELETE")
*/
public function deleteAction(Request $request){
$rep =this->getDoctrine()->getManager()->getRepository('AppBundle:Customer');
$customerId = $request->get('id');
if ($customerId != null) {
$rep->delete($customerId);
} else {
$rep->deleteAll();
}
$response = new Response(null, Response::HTTP_OK);
return $response;
}
}
class ProductController {
/**
* @Route("/product")
* @Method("DELETE")
*/
public function deleteAction(Request $request){
$rep =this->getDoctrine()->getManager()->getRepository('AppBundle:Product');
$productId = $request->get('id');
if ($productId != null) {
$rep->delete($productId);
} else {
$rep->deleteAll();
}
$response = new Response(null, Response::HTTP_OK);
return $response;
}
}
class CompanyController {
/**
* @Route("/company")
* @Method("DELETE")
*/
public function deleteAction(Request $request){
$rep =this->getDoctrine()->getManager()->getRepository('AppBundle:Company');
$companyId = $request->get('id');
if ($companyId != null) {
$rep->delete($companyId);
} else {
$rep->deleteAll();
}
$response = new Response(null, Response::HTTP_OK);
return $response;
}
}
依旧......
唯一真正改变的是实体名称(“客户”,“产品”,“公司”等......)。
您是否有任何想法如何摆脱所有这些冗余,同时保持代码可读?
我想到的第一件事是使用delete方法逻辑创建一个基类,并将实体名称作为参数传递。这样做可以吗?例如:
class CustomerController extends BaseController{
/**
* @Route("/customer")
* @Method("DELETE")
*/
public function deleteAction(Request $request){
parent::deleteAction($request, 'AppBundle:Customer');
}
以上是合法的解决方案吗?有没有办法进一步简化它?
答案 0 :(得分:1)
我会使用一个控制器。使用该路由获取实体类名。
/**
* @Route("/{entityName}/{entityId}")
* @Route("/{entityName}")
* @Method("DELETE")
*/
public function deleteAction($entityName, $entityId = null){
$rep =this->getDoctrine()->getManager()->getRepository('AppBundle:'.$entityName);
if ($productId != null) {
$rep->delete($productId);
} else {
$rep->deleteAll();
}
$response = new Response(null, Response::HTTP_OK);
return $response;
}
}
根据您构建路由的方式,您必须将$ entityName字符串转换为实例:/ entity-name到EntityName或/ entity转换为Entity