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 FamilyLogController extends Controller |
||
19 | { |
||
20 | /** |
||
21 | * Lists all FamilyLog entities. |
||
22 | * |
||
23 | * @Route("/", name="admin_familylog") |
||
24 | * @Method("GET") |
||
25 | * @Template() |
||
26 | */ |
||
27 | public function indexAction() |
||
36 | |||
37 | /** |
||
38 | * Finds and displays a FamilyLog entity. |
||
39 | * |
||
40 | * @Route("/{slug}/show", name="admin_familylog_show") |
||
41 | * @Method("GET") |
||
42 | * @Template() |
||
43 | */ |
||
44 | public function showAction(FamilyLog $familylog) |
||
53 | |||
54 | /** |
||
55 | * Displays a form to create a new FamilyLog entity. |
||
56 | * |
||
57 | * @Route("/new", name="admin_familylog_new") |
||
58 | * @Method("GET") |
||
59 | * @Template() |
||
60 | */ |
||
61 | public function newAction() |
||
71 | |||
72 | /** |
||
73 | * Creates a new FamilyLog entity. |
||
74 | * |
||
75 | * @Route("/create", name="admin_familylog_create") |
||
76 | * @Method("POST") |
||
77 | * @Template("AppBundle:FamilyLog:new.html.twig") |
||
78 | */ |
||
79 | public function createAction(Request $request) |
||
80 | { |
||
81 | $familylog = new FamilyLog(); |
||
82 | $form = $this->createForm(new FamilyLogType(), $familylog); |
||
83 | if ($form->handleRequest($request)->isValid()) { |
||
84 | $em = $this->getDoctrine()->getManager(); |
||
85 | $em->persist($familylog); |
||
86 | $em->flush(); |
||
87 | |||
88 | if ($form->get('save')->isClicked()) { |
||
|
|||
89 | $url = $this->redirect($this->generateUrl( |
||
90 | 'admin_familylog_show', |
||
91 | array('slug' => $familylog->getSlug()) |
||
92 | )); |
||
93 | } elseif ($form->get('addmore')->isClicked()) { |
||
94 | $this->addFlash('info', 'gestock.settings.add_ok'); |
||
95 | $url = $this->redirectToRoute('admin_familylog_new'); |
||
96 | } |
||
97 | return $url; |
||
98 | } |
||
99 | |||
100 | return array( |
||
101 | 'familylog' => $familylog, |
||
102 | 'form' => $form->createView(), |
||
103 | ); |
||
104 | } |
||
105 | |||
106 | /** |
||
107 | * Displays a form to edit an existing FamilyLog entity. |
||
108 | * |
||
109 | * @Route("/{slug}/edit", name="admin_familylog_edit") |
||
110 | * @Method("GET") |
||
111 | * @Template() |
||
112 | */ |
||
113 | View Code Duplication | public function editAction(FamilyLog $familylog) |
|
130 | |||
131 | /** |
||
132 | * Edits an existing FamilyLog entity. |
||
133 | * |
||
134 | * @Route("/{slug}/update", name="admin_familylog_update") |
||
135 | * @Method("PUT") |
||
136 | * @Template("AppBundle:FamilyLog:edit.html.twig") |
||
137 | */ |
||
138 | View Code Duplication | public function updateAction(FamilyLog $famlog, Request $request) |
|
160 | |||
161 | /** |
||
162 | * Deletes a FamilyLog entity. |
||
163 | * |
||
164 | * @Route("/{id}/delete", name="admin_familylog_delete", requirements={"id"="\d+"}) |
||
165 | * @Method("DELETE") |
||
166 | */ |
||
167 | public function deleteAction(FamilyLog $familylog, Request $request) |
||
178 | |||
179 | /** |
||
180 | * Create Delete form |
||
181 | * |
||
182 | * @param integer $id |
||
183 | * @param string $route |
||
184 | * @return \Symfony\Component\Form\Form |
||
185 | */ |
||
186 | protected function createDeleteForm($id, $route) |
||
194 | } |
||
195 |
Let’s take a look at an example:
In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different implementation of User which does not have a getDisplayName() method, the code will break.
Available Fixes
Change the type-hint for the parameter:
Add an additional type-check:
Add the method to the interface: