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  | 
            ||
| 30 | class U2fController extends SecondFactorController  | 
            ||
| 31 | { | 
            ||
| 32 | /**  | 
            ||
| 33 | * @Template  | 
            ||
| 34 | * @param Request $request  | 
            ||
| 35 | * @param string $procedureId  | 
            ||
| 36 | * @return array|Response  | 
            ||
| 37 | */  | 
            ||
| 38 | public function startAuthenticationAction(Request $request, $procedureId)  | 
            ||
| 54 | |||
| 55 | /**  | 
            ||
| 56 | * @Template  | 
            ||
| 57 | * @param Request $request  | 
            ||
| 58 | * @param string $procedureId  | 
            ||
| 59 | * @return array|Response  | 
            ||
| 60 | */  | 
            ||
| 61 | public function authenticationAction(Request $request, $procedureId)  | 
            ||
| 100 | |||
| 101 | /**  | 
            ||
| 102 | * @Template  | 
            ||
| 103 | */  | 
            ||
| 104 | public function provePossessionAction(Request $request, $procedureId)  | 
            ||
| 105 |     { | 
            ||
| 106 |         $this->assertSecondFactorEnabled('u2f'); | 
            ||
| 107 | |||
| 108 |         $session = $this->get('ra.session.u2f'); | 
            ||
| 109 | |||
| 110 | /** @var RegisterRequest $signRequest */  | 
            ||
| 111 |         $signRequest = $session->get('request'); | 
            ||
| 112 | $signResponse = new SignResponse();  | 
            ||
| 113 | |||
| 114 |         $formAction = $this->generateUrl('ra_vetting_u2f_prove_possession', ['procedureId' => $procedureId]); | 
            ||
| 115 | $form = $this  | 
            ||
| 116 | ->createForm(  | 
            ||
| 117 | VerifyDeviceAuthenticationType::class,  | 
            ||
| 118 | $signResponse,  | 
            ||
| 119 | ['sign_request' => $signRequest, 'action' => $formAction]  | 
            ||
| 120 | )  | 
            ||
| 121 | ->handleRequest($request);  | 
            ||
| 122 | |||
| 123 |         if (!$form->isSubmitted() || !$form->isValid()) { | 
            ||
| 124 |             return $this->render('SurfnetStepupRaRaBundle:Vetting/U2f:authentication.html.twig', [ | 
            ||
| 125 | 'authenticationFailed' => true,  | 
            ||
| 126 | 'procedureId' => $procedureId,  | 
            ||
| 127 | ]);  | 
            ||
| 128 | }  | 
            ||
| 129 | |||
| 130 | $service = $this->getVettingService();  | 
            ||
| 131 | $result = $service->verifyU2fAuthentication($procedureId, $signRequest, $signResponse);  | 
            ||
| 132 | |||
| 133 |         if ($result->wasSuccessful()) { | 
            ||
| 134 |             return $this->redirectToRoute('ra_vetting_verify_identity', ['procedureId' => $procedureId]); | 
            ||
| 135 |         } elseif ($result->didDeviceReportAnyError()) { | 
            ||
| 136 |             $this->addFlash('error', 'ra.vetting.u2f.alert.device_reported_an_error'); | 
            ||
| 137 | return ['authenticationFailed' => true, 'procedureId' => $procedureId];  | 
            ||
| 138 |         } else { | 
            ||
| 139 |             $this->addFlash('error', 'ra.vetting.u2f.alert.error'); | 
            ||
| 140 | return ['authenticationFailed' => true, 'procedureId' => $procedureId];  | 
            ||
| 141 | }  | 
            ||
| 142 | }  | 
            ||
| 143 | |||
| 144 | /**  | 
            ||
| 145 | * @return VettingService  | 
            ||
| 146 | */  | 
            ||
| 147 | private function getVettingService()  | 
            ||
| 151 | }  | 
            ||
| 152 | 
This check looks from parameters that have been defined for a function or method, but which are not used in the method body.