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 UserController extends BaseController |
||
| 40 | { |
||
| 41 | public function __construct() |
||
| 42 | { |
||
| 43 | } |
||
| 44 | |||
| 45 | /** |
||
| 46 | * List All Users. |
||
| 47 | * |
||
| 48 | * Lists all users currently on the system. |
||
| 49 | * |
||
| 50 | * @Get("/users/{?page}") |
||
| 51 | * @Versions({"v1"}) |
||
| 52 | * @Parameters({ |
||
| 53 | * @Parameter("page", type="integer", description="The page of results to view.", default=1) |
||
| 54 | * }) |
||
| 55 | * @Response(200) |
||
| 56 | */ |
||
| 57 | public function lists(Request $request) |
||
|
|
|||
| 58 | { |
||
| 59 | return Models\User::all()->toArray(); |
||
| 60 | } |
||
| 61 | |||
| 62 | /** |
||
| 63 | * List Specific User. |
||
| 64 | * |
||
| 65 | * Lists specific fields about a user or all fields pertaining to that user. |
||
| 66 | * |
||
| 67 | * @Get("/users/{id}/{fields}") |
||
| 68 | * @Versions({"v1"}) |
||
| 69 | * @Parameters({ |
||
| 70 | * @Parameter("id", type="integer", required=true, description="The ID of the user to get information on."), |
||
| 71 | * @Parameter("fields", type="string", required=false, description="A comma delimidated list of fields to include.") |
||
| 72 | * }) |
||
| 73 | * @Response(200) |
||
| 74 | */ |
||
| 75 | public function view(Request $request, $id) |
||
| 76 | { |
||
| 77 | $user = Models\User::with('servers')->where((is_numeric($id) ? 'id' : 'email'), $id)->first(); |
||
| 78 | if (! $user->first()) { |
||
| 79 | throw new NotFoundHttpException('No user by that ID was found.'); |
||
| 80 | } |
||
| 81 | |||
| 82 | $user->servers->transform(function ($item) { |
||
| 83 | return collect($item)->only([ |
||
| 84 | 'id', 'node_id', 'uuidShort', |
||
| 85 | 'uuid', 'name', 'suspended', |
||
| 86 | 'owner_id', |
||
| 87 | ]); |
||
| 88 | }); |
||
| 89 | |||
| 90 | View Code Duplication | if (! is_null($request->input('fields'))) { |
|
| 91 | $fields = explode(',', $request->input('fields')); |
||
| 92 | if (! empty($fields) && is_array($fields)) { |
||
| 93 | return collect($user)->only($fields); |
||
| 94 | } |
||
| 95 | } |
||
| 96 | |||
| 97 | return $user->toArray(); |
||
| 98 | } |
||
| 99 | |||
| 100 | /** |
||
| 101 | * Create a New User. |
||
| 102 | * |
||
| 103 | * @Post("/users") |
||
| 104 | * @Versions({"v1"}) |
||
| 105 | * @Transaction({ |
||
| 106 | * @Request({ |
||
| 107 | * "email": "[email protected]", |
||
| 108 | * "password": "foopassword", |
||
| 109 | * "admin": false, |
||
| 110 | * "custom_id": 123 |
||
| 111 | * }, headers={"Authorization": "Bearer <token>"}), |
||
| 112 | * @Response(201), |
||
| 113 | * @Response(422) |
||
| 114 | * }) |
||
| 115 | */ |
||
| 116 | public function create(Request $request) |
||
| 117 | { |
||
| 118 | try { |
||
| 119 | $user = new UserRepository; |
||
| 120 | $create = $user->create($request->only([ |
||
| 121 | 'email', 'username', 'name_first', |
||
| 122 | 'name_last', 'password', |
||
| 123 | 'root_admin', 'custom_id', |
||
| 124 | ])); |
||
| 125 | $create = $user->create($request->input('email'), $request->input('password'), $request->input('admin'), $request->input('custom_id')); |
||
| 126 | |||
| 127 | return ['id' => $create]; |
||
| 128 | } catch (DisplayValidationException $ex) { |
||
| 129 | throw new ResourceException('A validation error occured.', json_decode($ex->getMessage(), true)); |
||
| 130 | } catch (DisplayException $ex) { |
||
| 131 | throw new ResourceException($ex->getMessage()); |
||
| 132 | } catch (\Exception $ex) { |
||
| 133 | throw new ServiceUnavailableHttpException('Unable to create a user on the system due to an error.'); |
||
| 134 | } |
||
| 135 | } |
||
| 136 | |||
| 137 | /** |
||
| 138 | * Update an Existing User. |
||
| 139 | * |
||
| 140 | * The data sent in the request will be used to update the existing user on the system. |
||
| 141 | * |
||
| 142 | * @Patch("/users/{id}") |
||
| 143 | * @Versions({"v1"}) |
||
| 144 | * @Transaction({ |
||
| 145 | * @Request({ |
||
| 146 | * "email": "[email protected]" |
||
| 147 | * }, headers={"Authorization": "Bearer <token>"}), |
||
| 148 | * @Response(200, body={"email": "[email protected]"}), |
||
| 149 | * @Response(422) |
||
| 150 | * }) |
||
| 151 | * @Parameters({ |
||
| 152 | * @Parameter("id", type="integer", required=true, description="The ID of the user to modify.") |
||
| 153 | * }) |
||
| 154 | */ |
||
| 155 | View Code Duplication | public function update(Request $request, $id) |
|
| 156 | { |
||
| 157 | try { |
||
| 158 | $user = new UserRepository; |
||
| 159 | $user->update($id, $request->only([ |
||
| 160 | 'username', 'email', 'name_first', |
||
| 161 | 'name_last', 'password', |
||
| 162 | 'root_admin', 'language', |
||
| 163 | ])); |
||
| 164 | |||
| 165 | return Models\User::findOrFail($id); |
||
| 166 | } catch (DisplayValidationException $ex) { |
||
| 167 | throw new ResourceException('A validation error occured.', json_decode($ex->getMessage(), true)); |
||
| 168 | } catch (DisplayException $ex) { |
||
| 169 | throw new ResourceException($ex->getMessage()); |
||
| 170 | } catch (\Exception $ex) { |
||
| 171 | throw new ServiceUnavailableHttpException('Unable to update a user on the system due to an error.'); |
||
| 172 | } |
||
| 173 | } |
||
| 174 | |||
| 175 | /** |
||
| 176 | * Delete a User. |
||
| 177 | * |
||
| 178 | * @Delete("/users/{id}") |
||
| 179 | * @Versions({"v1"}) |
||
| 180 | * @Transaction({ |
||
| 181 | * @Request(headers={"Authorization": "Bearer <token>"}), |
||
| 182 | * @Response(204), |
||
| 183 | * @Response(422) |
||
| 184 | * }) |
||
| 185 | * @Parameters({ |
||
| 186 | * @Parameter("id", type="integer", required=true, description="The ID of the user to delete.") |
||
| 187 | * }) |
||
| 188 | */ |
||
| 189 | View Code Duplication | public function delete(Request $request, $id) |
|
| 202 | } |
||
| 203 |
This check looks from parameters that have been defined for a function or method, but which are not used in the method body.