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 |
||
| 18 | class UsersController extends ResourceController |
||
| 19 | { |
||
| 20 | public function setContainer(ContainerInterface $container = null) |
||
| 25 | |||
| 26 | /** |
||
| 27 | * @ApiDoc( |
||
| 28 | * resource=true, |
||
| 29 | * description="Liste les utilisateurs", |
||
| 30 | * output="KI\UserBundle\Entity\User", |
||
| 31 | * statusCodes={ |
||
| 32 | * 200="Requête traitée avec succès", |
||
| 33 | * 401="Une authentification est nécessaire pour effectuer cette action", |
||
| 34 | * 403="Pas les droits suffisants pour effectuer cette action", |
||
| 35 | * 503="Service temporairement indisponible ou en maintenance", |
||
| 36 | * }, |
||
| 37 | * section="Utilisateurs" |
||
| 38 | * ) |
||
| 39 | * @Route("/users") |
||
| 40 | * @Method("GET") |
||
| 41 | */ |
||
| 42 | public function getUsersAction() |
||
| 46 | |||
| 47 | /** |
||
| 48 | * @ApiDoc( |
||
| 49 | * description="Retourne un utilisateur", |
||
| 50 | * output="KI\UserBundle\Entity\User", |
||
| 51 | * statusCodes={ |
||
| 52 | * 200="Requête traitée avec succès", |
||
| 53 | * 401="Une authentification est nécessaire pour effectuer cette action", |
||
| 54 | * 403="Pas les droits suffisants pour effectuer cette action", |
||
| 55 | * 404="Ressource non trouvée", |
||
| 56 | * 503="Service temporairement indisponible ou en maintenance", |
||
| 57 | * }, |
||
| 58 | * section="Utilisateurs" |
||
| 59 | * ) |
||
| 60 | * @Route("/users/{slug}") |
||
| 61 | * @Method("GET") |
||
| 62 | */ |
||
| 63 | public function getUserAction($slug) |
||
| 69 | |||
| 70 | /** |
||
| 71 | * @ApiDoc( |
||
| 72 | * description="Modifie un utilisateur", |
||
| 73 | * input="KI\UserBundle\Form\UserType", |
||
| 74 | * statusCodes={ |
||
| 75 | * 204="Requête traitée avec succès mais pas d’information à renvoyer", |
||
| 76 | * 400="La syntaxe de la requête est erronée", |
||
| 77 | * 401="Une authentification est nécessaire pour effectuer cette action", |
||
| 78 | * 403="Pas les droits suffisants pour effectuer cette action", |
||
| 79 | * 404="Ressource non trouvée", |
||
| 80 | * 503="Service temporairement indisponible ou en maintenance", |
||
| 81 | * }, |
||
| 82 | * section="Utilisateurs" |
||
| 83 | * ) |
||
| 84 | * @Route("/users/{slug}") |
||
| 85 | * @Method("PATCH") |
||
| 86 | */ |
||
| 87 | public function patchUserAction(Request $request, $slug) |
||
| 117 | |||
| 118 | /** |
||
| 119 | * @ApiDoc( |
||
| 120 | * description="Supprime un utilisateur", |
||
| 121 | * statusCodes={ |
||
| 122 | * 204="Requête traitée avec succès mais pas d’information à renvoyer", |
||
| 123 | * 401="Une authentification est nécessaire pour effectuer cette action", |
||
| 124 | * 403="Pas les droits suffisants pour effectuer cette action", |
||
| 125 | * 404="Ressource non trouvée", |
||
| 126 | * 503="Service temporairement indisponible ou en maintenance", |
||
| 127 | * }, |
||
| 128 | * section="Utilisateurs" |
||
| 129 | * ) |
||
| 130 | * @Route("/users/{slug}") |
||
| 131 | * @Method("DELETE") |
||
| 132 | */ |
||
| 133 | public function deleteUserAction($slug) |
||
| 144 | |||
| 145 | /** |
||
| 146 | * @ApiDoc( |
||
| 147 | * description="Récupère la liste des clubs dont l'utilisateur est membre", |
||
| 148 | * output="KI\UserBundle\Entity\Club", |
||
| 149 | * statusCodes={ |
||
| 150 | * 200="Requête traitée avec succès", |
||
| 151 | * 401="Une authentification est nécessaire pour effectuer cette action", |
||
| 152 | * 403="Pas les droits suffisants pour effectuer cette action", |
||
| 153 | * 404="Ressource non trouvée", |
||
| 154 | * 503="Service temporairement indisponible ou en maintenance", |
||
| 155 | * }, |
||
| 156 | * section="Utilisateurs" |
||
| 157 | * ) |
||
| 158 | * @Route("/users/{slug}/clubs") |
||
| 159 | * @Method("GET") |
||
| 160 | */ |
||
| 161 | public function getUserClubsAction($slug) |
||
| 169 | |||
| 170 | /** |
||
| 171 | * @ApiDoc( |
||
| 172 | * description="Crée un compte et envoie un mail avec le mot de passe", |
||
| 173 | * requirements={ |
||
| 174 | * { |
||
| 175 | * "name"="firstName", |
||
| 176 | * "dataType"="string", |
||
| 177 | * "description"="Prénom" |
||
| 178 | * }, |
||
| 179 | * { |
||
| 180 | * "name"="lastName", |
||
| 181 | * "dataType"="string", |
||
| 182 | * "description"="Nom" |
||
| 183 | * }, |
||
| 184 | * { |
||
| 185 | * "name"="email", |
||
| 186 | * "dataType"="string", |
||
| 187 | * "description"="Adresse email" |
||
| 188 | * }, |
||
| 189 | * }, |
||
| 190 | * statusCodes={ |
||
| 191 | * 201="Requête traitée avec succès avec création d’un document", |
||
| 192 | * 503="Service temporairement indisponible ou en maintenance", |
||
| 193 | * }, |
||
| 194 | * section="Utilisateurs" |
||
| 195 | * ) |
||
| 196 | * @Route("/users") |
||
| 197 | * @Method("POST") |
||
| 198 | */ |
||
| 199 | public function postUsersAction(Request $request) |
||
| 245 | |||
| 246 | /** |
||
| 247 | * @ApiDoc( |
||
| 248 | * description="Crée un compte et envoie un mail avec le mot de passe", |
||
| 249 | * requirements={ |
||
| 250 | * { |
||
| 251 | * "name"="users", |
||
| 252 | * "dataType"="file", |
||
| 253 | * "description"="Prénom" |
||
| 254 | * }, |
||
| 255 | * }, |
||
| 256 | * statusCodes={ |
||
| 257 | * 201="Requête traitée avec succès avec création d’un document", |
||
| 258 | * 503="Service temporairement indisponible ou en maintenance", |
||
| 259 | * }, |
||
| 260 | * section="Utilisateurs" |
||
| 261 | * ) |
||
| 262 | * @Route("/import/users") |
||
| 263 | * @Method("POST") |
||
| 264 | */ |
||
| 265 | public function importUsersAction(Request $request) |
||
| 345 | |||
| 346 | private function stripAccents($string) |
||
| 353 | } |
||
| 354 |
This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.
Both the
$myVarassignment in line 1 and the$higherassignment in line 2 are dead. The first because$myVaris never used and the second because$higheris always overwritten for every possible time line.