Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.
Common duplication problems, and corresponding solutions are:
| 1 | <?php |
||
| 39 | class PackageController extends Controller |
||
| 40 | { |
||
| 41 | /** |
||
| 42 | * List all items. |
||
| 43 | * |
||
| 44 | * @ApiDoc( |
||
| 45 | * resource=true, |
||
| 46 | * description="List all packages", |
||
| 47 | * statusCodes={ |
||
| 48 | * 200="Returned on success.", |
||
| 49 | * 500="Returned when unexpected error occurred." |
||
| 50 | * }, |
||
| 51 | * filters={ |
||
| 52 | * {"name"="status", "dataType"="string", "pattern"="published|unpublished|new|canceled"}, |
||
| 53 | * {"name"="sorting", "dataType"="string", "pattern"="[updatedAt]=asc|desc"} |
||
| 54 | * } |
||
| 55 | * ) |
||
| 56 | * @Route("/api/{version}/packages/", options={"expose"=true}, defaults={"version"="v1"}, name="swp_api_core_list_packages") |
||
| 57 | * @Method("GET") |
||
| 58 | */ |
||
| 59 | public function listAction(Request $request) |
||
| 72 | |||
| 73 | /** |
||
| 74 | * Show single package. |
||
| 75 | * |
||
| 76 | * @ApiDoc( |
||
| 77 | * resource=true, |
||
| 78 | * description="Show single package", |
||
| 79 | * statusCodes={ |
||
| 80 | * 200="Returned on success." |
||
| 81 | * } |
||
| 82 | * ) |
||
| 83 | * @Route("/api/{version}/packages/{id}", options={"expose"=true}, defaults={"version"="v1"}, name="swp_api_core_show_package", requirements={"id"="\d+"}) |
||
| 84 | * @Method("GET") |
||
| 85 | */ |
||
| 86 | public function getAction(int $id) |
||
| 90 | |||
| 91 | /** |
||
| 92 | * Publishes package to many websites. |
||
| 93 | * |
||
| 94 | * @ApiDoc( |
||
| 95 | * resource=true, |
||
| 96 | * description="Publishes package to many tenants", |
||
| 97 | * statusCodes={ |
||
| 98 | * 200="Returned on success.", |
||
| 99 | * 400="Returned when validation failed.", |
||
| 100 | * 500="Returned when unexpected error." |
||
| 101 | * }, |
||
| 102 | * input="SWP\Bundle\CoreBundle\Form\Type\CompositePublishActionType" |
||
| 103 | * ) |
||
| 104 | * @Route("/api/{version}/packages/{id}/publish/", options={"expose"=true}, defaults={"version"="v1"}, name="swp_api_core_publish_package", requirements={"id"="\d+"}) |
||
| 105 | * |
||
| 106 | * @Method("POST") |
||
| 107 | */ |
||
| 108 | View Code Duplication | public function publishAction(Request $request, int $id) |
|
| 126 | |||
| 127 | /** |
||
| 128 | * Un-publishes package from many websites. |
||
| 129 | * |
||
| 130 | * @ApiDoc( |
||
| 131 | * resource=true, |
||
| 132 | * description="Un-publishes package from many tenants", |
||
| 133 | * statusCodes={ |
||
| 134 | * 200="Returned on success.", |
||
| 135 | * 400="Returned when validation failed.", |
||
| 136 | * 500="Returned when unexpected error." |
||
| 137 | * }, |
||
| 138 | * input="SWP\Bundle\CoreBundle\Form\Type\UnpublishFromTenantsType" |
||
| 139 | * ) |
||
| 140 | * @Route("/api/{version}/packages/{id}/unpublish/", options={"expose"=true}, defaults={"version"="v1"}, name="swp_api_core_unpublish_package", requirements={"id"="\d+"}) |
||
| 141 | * @Method("POST") |
||
| 142 | */ |
||
| 143 | public function unpublishAction(Request $request, int $id) |
||
| 161 | |||
| 162 | /** |
||
| 163 | * Update package. |
||
| 164 | * |
||
| 165 | * @param Request $request |
||
| 166 | * @param int $id |
||
| 167 | * |
||
| 168 | * @ApiDoc( |
||
| 169 | * resource=true, |
||
| 170 | * description="Updates package", |
||
| 171 | * statusCodes={ |
||
| 172 | * 200="Returned on success.", |
||
| 173 | * 400="Returned when validation failed.", |
||
| 174 | * 500="Returned when unexpected error." |
||
| 175 | * }, |
||
| 176 | * input="SWP\Bundle\CoreBundle\Form\Type\PackageType" |
||
| 177 | * ) |
||
| 178 | * |
||
| 179 | * @Route("/api/{version}/packages/{id}/", options={"expose"=true}, defaults={"version"="v1"}, name="swp_api_core_update_package", requirements={"id"="\d+"}) |
||
| 180 | * |
||
| 181 | * @Method("PATCH") |
||
| 182 | * |
||
| 183 | * @return SingleResourceResponse |
||
| 184 | */ |
||
| 185 | public function updateAction(Request $request, int $id) |
||
| 203 | |||
| 204 | /** |
||
| 205 | * @param int $id |
||
| 206 | * |
||
| 207 | * @return null|object |
||
| 208 | */ |
||
| 209 | View Code Duplication | private function findOr404(int $id) |
|
| 220 | |||
| 221 | protected function getPackageRepository() |
||
| 225 | } |
||
| 226 |
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.