-
-
Save NeftaliYagua/5484045 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
use Zend\Loader\StandardAutoloader as Autoloader, | |
Zend\Db\Metadata\Metadata, | |
Zend\Db\Adapter\Adapter as DbAdapter; | |
///////////////////////////////////// | |
// Inicio de configuración | |
///////////////////////////////////// | |
// | |
define('ZF2_PATH', '/path/to/zf2'); | |
define('TAB', ' '); | |
//define('TAB', "\t"); | |
$moduleName = 'tuModulo'; | |
$dbconfig = array( | |
'driver' => 'Mysqli', | |
'hostname' => 'localhost', | |
'username' => 'cambiame', | |
'password' => 'cambiame', | |
'database' => 'cambiame', | |
'table_type' => 'InnoDB' | |
); | |
///////////////////////////////////// | |
// Fin de Configuración | |
///////////////////////////////////// | |
require_once ZF2_PATH . '/library/Zend/Loader/StandardAutoloader.php'; | |
$autoloader = new Autoloader; | |
$autoloader->register(); | |
class ModelBuilder { | |
protected $db; | |
protected $stdin; | |
protected $module; | |
public function __construct($dbParams, $module) { | |
$this->db = new DbAdapter($dbParams); | |
$this->module = $module; | |
$this->stdin = fopen('php://stdin', 'r'); | |
} | |
public function run() { | |
$tables = $this->getTablesToModel(); | |
$files = $this->getFiles($tables); | |
$this->writeFiles($files); | |
} | |
public function getTablesToModel() { | |
$metadata = new Metadata($this->db); | |
foreach ($metadata->getTables() as $t) { | |
if ($this->prompt($t->getName())) { | |
$tables[] = $t; | |
} | |
} | |
return $tables; | |
} | |
public function writeFiles($files) { | |
foreach ($files as $dirname => $dir) { | |
foreach ($dir as $file => $content) { | |
$filename = $dirname . '/' . $file; | |
@mkdir(dirname($filename), 0777, true); | |
file_put_contents($filename, $content); | |
} | |
} | |
} | |
public function getFiles($tables) { | |
foreach ($tables as $t) { | |
$modelName = $this->toCamelCase($t->getName()); | |
$modelInterfaceName = $modelName . 'Interface'; | |
$mapperName = $modelName . 'Mapper'; | |
$mapperInterfaceName = $modelName . 'MapperInterface'; | |
$modelFile = <<<EOF | |
<?php | |
namespace {$this->module}\Model\\$modelName; | |
use ZfcBase\Model\ModelAbstract; | |
class $modelName extends ModelAbstract implements $modelInterfaceName | |
{ | |
EOF; | |
// fields | |
foreach ($t->getColumns() as $col) { | |
$colName = $this->toCamelCase($col->getName()); | |
$colName[0] = strtolower($colName[0]); | |
$modelFile .= TAB . "protected \${$colName};\n"; | |
} | |
$modelFile .= "\n"; | |
// getters and setters | |
foreach ($t->getColumns() as $col) { | |
$colName = $this->toCamelCase($col->getName()); | |
$colFuncName = $colName; | |
$colName[0] = strtolower($colName[0]); | |
$modelFile .= TAB . "public function get{$colFuncName}()\n"; | |
$modelFile .= TAB . "{\n"; | |
$modelFile .= TAB . TAB . "return \$this->$colName;\n"; | |
$modelFile .= TAB . "}\n\n"; | |
$modelFile .= TAB . "public function set{$colFuncName}(\$$colName)\n"; | |
$modelFile .= TAB . "{\n"; | |
$modelFile .= TAB . TAB . "\$this->$colName = \$$colName;\n"; | |
$modelFile .= TAB . TAB . "return \$this;\n"; | |
$modelFile .= TAB . "}\n\n"; | |
} | |
$modelFile .= "}"; | |
$files[$modelName][$modelName . '.php'] = $modelFile; | |
/** | |
* Inicio de interfáz del modelo | |
*/ | |
$iModelFile = <<<EOF | |
<?php | |
namespace {$this->module}\Model\\$modelName; | |
interface $modelInterfaceName | |
{ | |
EOF; | |
foreach ($t->getColumns() as $col) { | |
$colName = $this->toCamelCase($col->getName()); | |
$colFuncName = $colName; | |
$colName[0] = strtolower($colName[0]); | |
$iModelFile .= TAB . "public function get{$colFuncName}();\n"; | |
$iModelFile .= TAB . "public function set{$colFuncName}(\$$colName);\n"; | |
} | |
$iModelFile .= "}"; | |
$files[$modelName][$modelInterfaceName . '.php'] = $iModelFile; | |
/** | |
* Inicio de Mapeo del modelo | |
*/ | |
$iMapperFile = <<<EOF | |
<?php | |
namespace {$this->module}\Model\\$modelName; | |
interface $mapperInterfaceName | |
{ | |
} | |
EOF; | |
$files[$modelName][$mapperInterfaceName . '.php'] = $iMapperFile; | |
/** | |
* Inicio de mapeo | |
*/ | |
$mapperFile = <<<EOF | |
<?php | |
namespace {$this->module}\Model\\$modelName; | |
use ZfcBase\Mapper\DbMapperAbstract; | |
class $mapperName extends DbMapperAbstract implements $mapperInterfaceName | |
{ | |
protected \$tableName = '{$t->getName()}'; | |
} | |
EOF; | |
$files[$modelName][$mapperName . '.php'] = $mapperFile; | |
} | |
return $files; | |
} | |
protected function prompt($tableName) { | |
echo "Do you want to model this table ($tableName)? (y/N) "; | |
$answer = fgets($this->stdin, 256); | |
if (strtolower($answer[0]) === 'y') { | |
return true; | |
} else { | |
return false; | |
} | |
} | |
protected function toCamelCase($name) | |
{ | |
return implode('',array_map('ucfirst', explode('_',$name))); | |
} | |
protected static function fromCamelCase($name) | |
{ | |
return trim(preg_replace_callback('/([A-Z])/', function($c){ return '_'.strtolower($c[1]); }, $name),'_'); | |
} | |
} | |
$builder = new ModelBuilder($dbconfig, $moduleName); | |
$builder->run(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment