activityRepository = $activityRepository; $this->socialIssueRender = $socialIssueRender; $this->token = $token; } public function validate($period, Constraint $constraint) { if (!$constraint instanceof AccompanyingPeriodValidity) { throw new UnexpectedTypeException($constraint, AccompanyingPeriodValidity::class); } if (!$period instanceof AccompanyingPeriod) { throw new UnexpectedValueException($period, AccompanyingPeriod::class); } /** Check if a social issue can be deleted (is not linked to an action or activity within the parcours) */ $socialIssues = []; $activities = $this->activityRepository->findBy(['accompanyingPeriod' => $period]); foreach ($activities as $activity) { $socialIssues = array_merge($socialIssues, $activity->getSocialIssues()->toArray()); } foreach ($period->getWorks() as $work) { $socialIssues[] = $work->getSocialAction()->getIssue(); } $socialIssuesByKey = []; foreach ($socialIssues as $si) { $socialIssuesByKey[spl_object_hash($si)] = $si; } $periodIssuesWithAncestors = []; foreach ($period->getSocialIssues() as $si) { /** @var SocialIssue $si */ $periodIssuesWithAncestors = array_merge( $periodIssuesWithAncestors, array_map( static function (SocialIssue $si) { return spl_object_hash($si); }, $si->getAncestors(true) ) ); } foreach ($socialIssuesByKey as $key => $si) { if (!in_array($key, $periodIssuesWithAncestors, true)) { $this->context ->buildViolation( $constraint->messageSocialIssueCannotBeDeleted ) ->setParameter('%name%', $this->socialIssueRender->renderString($si, [])) ->addViolation(); } } } }