YiiRequirementChecker.php 3.13 KB
Newer Older
1 2 3 4 5 6 7 8 9 10
<?php
/**
 * @link http://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */

/**
 * YiiRequirementChecker allows checking, if current system meets the requirements for running the application.
 *
11 12
 * @property array|null $result the check results.
 *
13 14 15 16 17
 * @author Paul Klimov <klimov.paul@gmail.com>
 * @since 2.0
 */
class YiiRequirementChecker
{
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
	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,
		);
		return $result;
	}

	/**
	 * 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);
	}
104

105 106 107 108 109 110 111 112 113
	/**
	 * 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.';');
	}
114
}