redirectsRepository = $redirectsRepository; } /** * @param array|null $redirect * @param string $labelSuffix Appended to trace step labels (e.g. ' (without comments)'). * @param array $options * @param ABJ_404_Solution_FrontendPipelineTrace $trace * @return array|null The redirect row if actionable, null otherwise. */ function evaluate(?array $redirect, string $labelSuffix, array $options, ABJ_404_Solution_FrontendPipelineTrace $trace): ?array { if ($redirect === null) { if ($labelSuffix === '') { $trace->add('Redirect lookup', 'No matching redirect'); } return null; } $typeHomeInt = (int)ABJ404_TYPE_HOME; $redirectType = isset($redirect['type']) && is_scalar($redirect['type']) ? (int)$redirect['type'] : 0; if ($redirect['id'] == '0' || ($redirect['final_dest'] == '0' && $redirectType !== $typeHomeInt)) { if ($labelSuffix === '') { $trace->add('Redirect lookup', 'No matching redirect'); } return null; } $trace->add('Redirect lookup' . $labelSuffix, 'Found existing redirect', 'rule #' . (is_scalar($redirect['id']) ? (string)$redirect['id'] : '?')); $redirectIdForCheck = is_scalar($redirect['id']) ? (int) $redirect['id'] : 0; $deadIds = abj_service('redirect_dead_destination_checker')->findDeadDestinationIds(array($redirectIdForCheck)); if (!empty($deadIds)) { $trace->add('Health check' . $labelSuffix, 'Destination unreachable - skipped'); return null; } $condEvaluator = new ABJ_404_Solution_RedirectConditionEvaluator($this->redirectsRepository); $redirectIdForCond = is_scalar($redirect['id']) ? (int)$redirect['id'] : 0; if ($condEvaluator->shouldApplyRedirect($redirectIdForCond)) { $trace->add('Conditions' . $labelSuffix, 'All conditions met'); return $redirect; } $condTrace = $condEvaluator->getLastEvaluationTrace(); $condDetail = implode(', ', array_map(function ($c) { $label = str_replace('_', ' ', $c['type']); return $label . ': ' . ($c['result'] ? 'passed' : 'failed'); }, $condTrace)); $trace->add('Conditions' . $labelSuffix, 'Blocked by conditions', $condDetail); return null; } /** * @param array $redirect * @return bool */ function isAutoRedirect(array $redirect): bool { return isset($redirect['status']) && is_scalar($redirect['status']) && (int)$redirect['status'] === (int)ABJ404_STATUS_AUTO; } }