getMembersHolder(); if ($holders->count() <= self::MAX_HOLDERS) { return; } $covers = new DateRangeCovering( self::MAX_HOLDERS, $holders->first()->getStartDate()->getTimezone() ); foreach ($holders as $key => $member) { $covers->add($member->getStartDate(), $member->getEndDate(), $key); } $covers->compute(); if ($covers->hasIntersections()) { foreach ($covers->getIntersections() as [$start, $end, $ids]) { $msg = null === $end ? $constraint->messageInfinity : $constraint->message; $this->context->buildViolation($msg) ->setParameters([ '{{ start }}' => $start->format('d-m-Y'), // TODO fix when MessageParameter works with timezone '{{ end }}' => null === $end ? null : $end->format('d-m-Y'), ]) ->addViolation(); } } } }