activityRepository = $activityRepository; $this->socialIssueRender = $socialIssueRender; } 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); } $socialIssues = []; $activities = $this->activityRepository->findBy(['accompanyingPeriod' => $period]); foreach ($activities as $activity) { $socialIssues = $activity->getSocialIssues()->toArray(); } foreach ($period->getWorks() as $work) { $socialIssues[] = $work->getSocialAction()->getIssue(); } $socialIssuesByKey = []; foreach ($socialIssues as $si) { $socialIssuesByKey[$si->getId()] = $si; } $periodIssuesWithAncestors = []; foreach ($period->getSocialIssues() as $si) { /** @var SocialIssue $si */ $periodIssuesWithAncestors = array_merge( $periodIssuesWithAncestors, array_map( static function (SocialIssue $si) { return $si->getId(); }, $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(); } } } }