| Conditions | 30 |
| Paths | 253 |
| Total Lines | 142 |
| Code Lines | 99 |
| Lines | 0 |
| Ratio | 0 % |
| Tests | 0 |
| CRAP Score | 930 |
| Changes | 3 | ||
| Bugs | 0 | Features | 0 |
Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.
For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.
Commonly applied refactorings include:
If many parameters/temporary variables are present:
Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.
There are several approaches to avoid long parameter lists:
| 1 | <?php |
||
| 58 | #[Route(path: '', name: 'timetable')] |
||
| 59 | public function index(StudentFilter $studentFilter, TeachersFilter $teachersFilter, GradeFilter $gradeFilter, RoomFilter $roomFilter, SubjectsFilter $subjectFilter, |
||
| 60 | TimetableLessonRepositoryInterface $lessonRepository, TimetableSupervisionRepositoryInterface $supervisionRepository, TimetableFilter $timetableFilter, ImportDateTypeRepositoryInterface $importDateTypeRepository, |
||
| 61 | SubjectRepositoryInterface $subjectRepository, SectionFilter $sectionFilter, Request $request, UserRepositoryInterface $userRepository): Response { |
||
| 62 | /** @var User $user */ |
||
| 63 | $user = $this->getUser(); |
||
| 64 | |||
| 65 | if($request->isMethod('POST')) { |
||
| 66 | $onlyOneWeek = $request->request->getBoolean('only_one_week'); |
||
| 67 | $user->setData(self::OnlyOneWeek, $onlyOneWeek); |
||
| 68 | |||
| 69 | $userRepository->persist($user); |
||
| 70 | return $this->redirectToRoute('timetable', $request->query->all()); |
||
| 71 | } |
||
| 72 | |||
| 73 | $sectionFilterView = $sectionFilter->handle($request->query->get('section', null)); |
||
| 74 | $gradeFilterView = $gradeFilter->handle($request->query->get('grade', null), $sectionFilterView->getCurrentSection(), $user); |
||
| 75 | $roomFilterView = $roomFilter->handle($request->query->get('room', null), $user); |
||
| 76 | $subjectFilterView = $subjectFilter->handle($this->getArrayOrNull($request->query->all('subjects')), $user); |
||
| 77 | $studentFilterView = $studentFilter->handle($request->query->get('student', null), $sectionFilterView->getCurrentSection(), $user, $gradeFilterView->getCurrentGrade() === null && $roomFilterView->getCurrentRoom() === null && (is_countable($subjectFilterView->getCurrentSubjects()) ? count($subjectFilterView->getCurrentSubjects()) : 0) === 0); |
||
| 78 | $teachersFilterView = $teachersFilter->handle($this->getArrayOrNull($request->query->all('teachers')), $sectionFilterView->getCurrentSection(), $user, $studentFilterView->getCurrentStudent() === null && $gradeFilterView->getCurrentGrade() === null && $roomFilterView->getCurrentRoom() === null && (is_countable($subjectFilterView->getCurrentSubjects()) ? count($subjectFilterView->getCurrentSubjects()) : 0) === 0); |
||
| 79 | |||
| 80 | $selectedDate = $this->resolveSelectedDate($request, $sectionFilterView->getCurrentSection(), $this->dateHelper); |
||
| 81 | |||
| 82 | $start = max( |
||
| 83 | $selectedDate, |
||
| 84 | $startDate = $this->timetableSettings->getStartDate($user->getUserType()) |
||
| 85 | ); |
||
| 86 | $end = min( |
||
| 87 | (clone $start)->modify('+13 days'), |
||
| 88 | $endDate = $this->timetableSettings->getEndDate($user->getUserType()) |
||
| 89 | ); |
||
| 90 | |||
| 91 | $lessons = [ ]; |
||
| 92 | $supervisions = [ ]; |
||
| 93 | $membershipsTypes = [ ]; |
||
| 94 | |||
| 95 | if($start <= $end) { |
||
| 96 | if ($studentFilterView->getCurrentStudent() !== null) { |
||
| 97 | $lessons = $lessonRepository->findAllByStudent($start, $end, $studentFilterView->getCurrentStudent()); |
||
| 98 | $lessons = $timetableFilter->filterStudentLessons($lessons); |
||
| 99 | |||
| 100 | $gradeIdsWithMembershipTypes = $this->timetableSettings->getGradeIdsWithMembershipTypes(); |
||
| 101 | |||
| 102 | /** @var StudyGroupMembership $membership */ |
||
| 103 | foreach($studentFilterView->getCurrentStudent()->getStudyGroupMemberships() as $membership) { |
||
| 104 | foreach($membership->getStudyGroup()->getGrades() as $grade) { |
||
| 105 | if (in_array($grade->getId(), $gradeIdsWithMembershipTypes)) { |
||
| 106 | $membershipsTypes[$membership->getStudyGroup()->getId()] = $membership->getType(); |
||
| 107 | } |
||
| 108 | } |
||
| 109 | } |
||
| 110 | } else if (count($teachersFilterView->getCurrentTeachers()) > 0) { |
||
| 111 | $lessons = [ ]; |
||
| 112 | $supervisions = [ ]; |
||
| 113 | |||
| 114 | foreach($teachersFilterView->getCurrentTeachers() as $teacher) { |
||
| 115 | $lessons = array_merge($lessons, $timetableFilter->filterTeacherLessons($lessonRepository->findAllByTeacher($start, $end, $teacher))); |
||
| 116 | $supervisions = array_merge($supervisions, $supervisionRepository->findAllByTeacher($start, $end, $teacher)); |
||
| 117 | } |
||
| 118 | } else if ($gradeFilterView->getCurrentGrade() !== null) { |
||
| 119 | $lessons = $lessonRepository->findAllByGrade($start, $end, $gradeFilterView->getCurrentGrade()); |
||
| 120 | $lessons = $timetableFilter->filterGradeLessons($lessons); |
||
| 121 | } else if ($roomFilterView->getCurrentRoom() !== null) { |
||
| 122 | $lessons = $lessonRepository->findAllByRoom($start, $end, $roomFilterView->getCurrentRoom()); |
||
| 123 | $lessons = $timetableFilter->filterRoomLessons($lessons); |
||
| 124 | } else if ((is_countable($subjectFilterView->getSubjects()) ? count($subjectFilterView->getSubjects()) : 0) > 0) { |
||
| 125 | $lessons = $lessonRepository->findAllBySubjects($start, $end, $subjectFilterView->getCurrentSubjects()); |
||
| 126 | $lessons = $timetableFilter->filterSubjectsLessons($lessons); |
||
| 127 | } |
||
| 128 | } |
||
| 129 | |||
| 130 | if((is_countable($lessons) ? count($lessons) : 0) === 0 && count($supervisions) === 0) { |
||
| 131 | $timetable = null; |
||
| 132 | } else { |
||
| 133 | $weeks = $this->getWeeksToDisplay($start, $end, $user->getData(self::OnlyOneWeek, false)); |
||
| 134 | $timetable = $this->timetableHelper->makeTimetable($weeks, $lessons, $supervisions); |
||
| 135 | } |
||
| 136 | |||
| 137 | $startTimes = [ ]; |
||
| 138 | $endTimes = [ ]; |
||
| 139 | |||
| 140 | for($lesson = 1; $lesson <= $this->timetableSettings->getMaxLessons(); $lesson++) { |
||
| 141 | $startTimes[$lesson] = $this->timetableSettings->getStart($lesson); |
||
| 142 | $endTimes[$lesson] = $this->timetableSettings->getEnd($lesson); |
||
| 143 | } |
||
| 144 | |||
| 145 | $template = 'timetable/index.html.twig'; |
||
| 146 | |||
| 147 | if($request->query->getBoolean('print', false) === true) { |
||
| 148 | $template = 'timetable/index_print.html.twig'; |
||
| 149 | |||
| 150 | if($timetable === null) { |
||
| 151 | $query = $request->query->all(); |
||
| 152 | unset($query['print']); |
||
| 153 | $this->addFlash('info', 'plans.timetable.print.empty'); |
||
| 154 | return $this->redirectToRoute('timetable', $query); |
||
| 155 | } |
||
| 156 | } |
||
| 157 | |||
| 158 | $supervisionLabels = [ ]; |
||
| 159 | for($i = 1; $i <= $this->timetableSettings->getMaxLessons(); $i++) { |
||
| 160 | $supervisionLabels[$i] = $this->timetableSettings->getDescriptionBeforeLesson($i); |
||
| 161 | } |
||
| 162 | |||
| 163 | $subjects = ArrayUtils::createArrayWithKeys( |
||
| 164 | $subjectRepository->findAll(), |
||
| 165 | fn(Subject $subject) => $subject->getAbbreviation() |
||
| 166 | ); |
||
| 167 | |||
| 168 | $weekStarts = [ ]; |
||
| 169 | |||
| 170 | if($startDate !== null && $endDate !== null && $sectionFilterView->getCurrentSection() !== null) { |
||
| 171 | $weekStarts = $this->listCalendarWeeks( |
||
| 172 | max($startDate, $sectionFilterView->getCurrentSection()->getStart()), |
||
| 173 | min($endDate, $sectionFilterView->getCurrentSection()->getEnd()) |
||
| 174 | ); |
||
| 175 | } |
||
| 176 | |||
| 177 | return $this->renderWithMessages($template, [ |
||
| 178 | 'compact' => count($teachersFilterView->getCurrentTeachers()) > 1, |
||
| 179 | 'timetable' => $timetable, |
||
| 180 | 'studentFilter' => $studentFilterView, |
||
| 181 | 'teachersFilter' => $teachersFilterView, |
||
| 182 | 'gradeFilter' => $gradeFilterView, |
||
| 183 | 'roomFilter'=> $roomFilterView, |
||
| 184 | 'subjectFilter' => $subjectFilterView, |
||
| 185 | 'sectionFilter' => $sectionFilterView, |
||
| 186 | 'startTimes' => $startTimes, |
||
| 187 | 'endTimes' => $endTimes, |
||
| 188 | 'gradesWithCourseNames' => $this->timetableSettings->getGradeIdsWithCourseNames(), |
||
| 189 | 'memberships' => $membershipsTypes, |
||
| 190 | 'query' => $request->query->all(), |
||
| 191 | 'supervisionLabels' => $supervisionLabels, |
||
| 192 | 'supervisionSubject' => $this->timetableSettings->getSupervisionLabel(), |
||
| 193 | 'supervisionColor' => $this->timetableSettings->getSupervisionColor(), |
||
| 194 | 'last_import_lessons' => $importDateTypeRepository->findOneByEntityClass(TimetableLesson::class), |
||
| 195 | 'last_import_supervisions' => $importDateTypeRepository->findOneByEntityClass(TimetableSupervision::class), |
||
| 196 | 'subjects' => $subjects, |
||
| 197 | 'selectedDate' => $selectedDate, |
||
| 198 | 'weekStarts' => $weekStarts, |
||
| 199 | 'onlyOneWeek' => $user->getData(self::OnlyOneWeek, false) |
||
| 200 | ]); |
||
| 352 | } |