Symfony 2 - 减少冗余代码的方法

时间:2017-03-10 21:33:52

标签: php symfony

我正在编写一个简单的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');
}

以上是合法的解决方案吗?有没有办法进一步简化它?

1 个答案:

答案 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