* @since 2.0 */ class YiiRequirementChecker { function check($requirements) { if (!is_array($requirements)) { $this->usageError("Requirements must be an array!"); } $summary = array( 'total' => 0, 'errors' => 0, 'warnings' => 0, ); foreach ($requirements as $key => $rawRequirement) { $requirement = $this->normalizeRequirement($rawRequirement, $key); $summary['total']++; if (!$requirement['condition']) { if ($requirement['mandatory']) { $requirement['error'] = true; $requirement['warning'] = true; $summary['errors']++; } else { $requirement['error'] = false; $requirement['warning'] = true; $summary['warnings']++; } } else { $requirement['error'] = false; $requirement['warning'] = false; } $requirements[$key] = $requirement; } $result = array( 'summary' => $summary, 'requirements' => $requirements, ); $this->result = $result; return $this; } /** * Return the check results. * @return array|null check results. */ function getResult() { if (isset($this->result)) { return $this->result; } else { return null; } } /** * Renders the requirements check result. * The output will vary depending is a script running from web or from console. */ function render() { if (isset($this->result)) { $this->usageError('Nothing to render!'); } // @todo render } /** * Normalizes requirement ensuring it has correct format. * @param array $requirement raw requirement. * @param int $requirementKey requirement key in the list. * @return array normalized requirement. */ function normalizeRequirement($requirement, $requirementKey=0) { if (!is_array($requirement)) { $this->usageError('Requirement must be an array!'); } if (!array_key_exists('condition', $requirement)) { $this->usageError("Requirement '{$requirementKey}' has no condition!"); } else { $evalPrefix = 'eval:'; if (is_string($requirement['condition']) && strpos($requirement['condition'], $evalPrefix)===0) { $expression = substr($requirement['condition'], strlen($evalPrefix)); $requirement['condition'] = $this->evaluateExpression($expression); } } if (!array_key_exists('name', $requirement)) { $requirement['name'] = is_numeric($requirementKey) ? 'Requirement #'.$requirementKey : $requirementKey; } if (!array_key_exists('mandatory', $requirement)) { if (array_key_exists('required', $requirement)) { $requirement['mandatory'] = $requirement['required']; } else { $requirement['mandatory'] = false; } } if (!array_key_exists('by', $requirement)) { $requirement['by'] = 'Unknown'; } if (!array_key_exists('memo', $requirement)) { $requirement['memo'] = ''; } return $requirement; } /** * Displays a usage error. * This method will then terminate the execution of the current application. * @param string $message the error message */ function usageError($message) { echo "Error: $message\n\n"; exit(1); } /** * Evaluates a PHP expression under the context of this class. * @param string $expression a PHP expression to be evaluated. * @return mixed the expression result. */ function evaluateExpression($expression) { return eval('return '.$expression.';'); } }