ClassmapController.php 2.07 KB
Newer Older
Qiang Xue committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
<?php
/**
 * @link http://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */

namespace yii\build\controllers;

use yii\console\Controller;
use yii\helpers\FileHelper;

/**
 * @author Qiang Xue <qiang.xue@gmail.com>
 * @since 2.0
 */
17
class ClassmapController extends Controller
Qiang Xue committed
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
{
	public $defaultAction = 'create';

	/**
	 * Creates a class map for the core Yii classes.
	 * @param string $root the root path of Yii framework. Defaults to YII_PATH.
	 * @param string $mapFile the file to contain the class map. Defaults to YII_PATH . '/classes.php'.
	 */
	public function actionCreate($root = null, $mapFile = null)
	{
		if ($root === null) {
			$root = YII_PATH;
		}
		$root = FileHelper::normalizePath($root);
		if ($mapFile === null) {
			$mapFile = YII_PATH . '/classes.php';
		}
Alexander Makarov committed
35
		$options = [
Alexander Makarov committed
36
			'filter' => function ($path) {
Qiang Xue committed
37 38 39 40 41 42 43 44
				if (is_file($path)) {
					$file = basename($path);
					if ($file[0] < 'A' || $file[0] > 'Z') {
						return false;
					}
				}
				return null;
			},
Alexander Makarov committed
45 46
			'only' => ['.php'],
			'except' => [
Qiang Xue committed
47
				'Yii.php',
48
				'BaseYii.php',
Qiang Xue committed
49
				'/console/',
Alexander Makarov committed
50 51
			],
		];
Qiang Xue committed
52
		$files = FileHelper::findFiles($root, $options);
Alexander Makarov committed
53
		$map = [];
Qiang Xue committed
54 55
		foreach ($files as $file) {
			if (($pos = strpos($file, $root)) !== 0) {
56
				die("Something wrong: $file\n");
Qiang Xue committed
57 58
			}
			$path = str_replace('\\', '/', substr($file, strlen($root)));
59
			$map[$path] = "\t'yii" . substr(str_replace('/', '\\', $path), 0, -4) . "' => YII_PATH . '$path',";
Qiang Xue committed
60
		}
61
		ksort($map);
Qiang Xue committed
62 63 64 65 66 67
		$map = implode("\n", $map);
		$output = <<<EOD
<?php
/**
 * Yii core class map.
 *
68
 * This file is automatically generated by the "build classmap" command under the "build" folder.
Qiang Xue committed
69 70 71 72 73 74 75
 * Do not modify it directly.
 *
 * @link http://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */

Alexander Makarov committed
76
return [
Qiang Xue committed
77
$map
Alexander Makarov committed
78
];
Qiang Xue committed
79 80 81

EOD;
		if (is_file($mapFile) && file_get_contents($mapFile) === $output) {
82
			echo "Nothing changed.\n";
Qiang Xue committed
83 84
		} else {
			file_put_contents($mapFile, $output);
85
			echo "Class map saved in $mapFile\n";
Qiang Xue committed
86 87 88
		}
	}
}