日期:2014-05-17 浏览次数:20793 次
Zend framework提供了一种class和table映射起来的方式,创建一个继承Zend_Db_Table的class。查询时,zend自动将表字段做处理,生成一个对象,对象属性都是动态创建,所以是public的。这有两个大问题,一是class的属性是public,二是class的属性只有代码执行后才确定。于是乎,自己写了一个程序,根据表信息生成对应的class。
?
?
<?php
/**
* 这个类的作用是从数据库里读出表结构,然后生成一个bean类,并将其属性与类一一映射。
* 具体生成的内容包括:
* 1. 私有变量
* 2. 表字段与属性的映射关系
* 3. 表字段的信息,用于server的验证
*/
class TableClassGenerator {
const DEFAULT_DIR = 'classes';
const DEFAULT_INDENT = 4;
const DEFAULT_MIN = 2;
private $excludedProperties;
private $database;
private $file;
private $givenTables;
private $parentClass;
public function __construct($config) {
if (!isset($config) || empty($config) || ! is_array($config)) {
die('Invalid config: '. print_r($config, true));
}
$this->database = $config['database'];
$conn = isset($config['password'])
? mysql_connect($config['host'], $config['user'], $config['password'])
: mysql_connect($config['host'], $config['user']);
if (! isset($conn)) {
die('Failed to connect.' . mysql_error());
}
$this->givenTables = $config['tables'];
if (isset($this->givenTables)
&& (!is_array($this->givenTables)
|| empty($this->givenTables))) {
die("Tables($this->givenTables) in config is not an array or it is empty.");
}
$this->parentClass = $config['parentClass'];
if ($config['excludedProperties']) {
$this->excludedProperties = $config['excludedProperties'];
if (!is_array($this->excludedProperties)
|| empty($this->excludedProperties)) {
die('excludedProperties should be an array and shoudnot be empty.');
}
}
if (! file_exists(self::DEFAULT_DIR)) {
mkdir(self::DEFAULT_DIR);
}
}
public function __destroy() {
mysql_close();
}
public function generateClasses() {
$allTables = $this->getTables();
var_dump($allTables);
$tables = $this->givenTables
? $this->givenTables
: $allTables;
if (empty($tables)) {
die("Empty given tables");
}
foreach ($tables as $table) {
$index = array_search($table, $allTables);
if (!is_int($index)) {
echo "Table($table) not found in database({$this->database}).\n";
continue;
}
$this->generateClassForTable($table);
}
}
private function generateClassForTable($table) {
$class = ucfirst($this->transform($table));
$fileName = self::DEFAULT_DIR . "/$class.php";
if (file_exists($fileName)) {
echo "The file($fileName) already exists. You need delete if first.\n";
//return;
}
$columns = $this->getTableColumns($table);
if (!isset($columns) || empty($columns)) {
echo "The table($table) doesn't have columns.\n";
return;
}
$this->file = fopen($fileName, 'w');
if (! isset($this->file)) {
die("Failed to open file: $fileName");
}
echo "Generating class for table: $table.\n";
$this->writeToFile("<?php");
if ($this->parentClass) {
$this->writeToFile("class $class extends {$this->parentClass} {");
} else {
$this->writeToFile("class $class {");
}
$this->generateConst($table);
$this->generateColumnPropMapping($columns);
$this->generateValidateConfig($table, $columns);
$this->generateProperties($columns);
$this->generateGetters($columns);
$this->generateSetters($columns);
$this->writeToFile("}");
$this->writeToFile("?>");
fclose($this->file);
echo "Class($class) was created in the file($fileName).\n\n";
}
private function generateColumnPropMapping($columns) {
$this->wri