<?php
class Object {
//
protected $hasMany;
protected $theSignificativeProperties = ['nome', 'login'];
public function getHasMany() {
return $this->hasMany;
}
public function getSignificativeProperties() {
return $this->theSignificativeProperties;
}
public function validar() {
//
}
}
class Aluno extends Object {
private $nome;
private $login;
protected $hasMany = ['post', 'disciplina'];
protected $theSignificativeProperties = ['nome', 'login'];
/*public function getHasMany() {
return $this->hasMany;
}*/
/*public function getSignificativeProperties() {
return $this->theSignificativeProperties;
}*/
}
class Post extends Object {
//
}
class Disciplina extends Object {
protected $hasMany = ['aluno'];
}
class EntityManager {
//
}
class RelationalEntityManager extends EntityManager {
public function find($array) {
//
echo 'Usando o RelationalEntityManager. ';
echo 'Vou fazer JOIN com ';
print_r($array);
$query = 'SELECT';
return array('query'=>$query, 'data'=>$array);
}
}
class BaseController {
protected $objectService;
protected $model;
public function __construct($modelName) {
$this->model = $modelName;
$this->objectService = new BaseObjectService($modelName, new RelationalEntityManager());
}
public function view() {
$args = func_get_args();
$this->objectService->view($args);
}
public function save() {
$formFields = array('name'=>'Marcelo', 'login'=>'marcelo'); // $_POST;
}
}
class AlunoController extends BaseController {
}
class DisciplinaController extends BaseController {
}
class BaseObjectService { // BaseObjectEngine
protected $em;
protected $model;
public function __construct($modelName, EntityManager $entityManager) {
$this->model = $modelName;
$this->em = $entityManager;
}
public function informa_os_has_many($classe, $chave) {
//
$tem = false;
$reflect = new ReflectionClass(ucfirst($classe));
$methods = $reflect->getMethods();
foreach ($methods as $method) {
//print $method->getName() . ", ";
if ( $method->getName() == 'getHasMany') {
//echo 'achou o HASMANY de ' . $this->model ;
//print_r($reflect->getHasMany());
$hasManyMethod = $reflect->getMethod('getHasMany');
$c = ucfirst($classe);
$x = new $c();
$array = $hasManyMethod->invoke($x);
if ( in_array($chave, $array) ) {
$tem = true;
break;
}
}
}
return $tem;
}
public function view($args) {
//
//echo 'Argumentos: ';
//print_r($args);
//echo 'Classe em questão: ' . $this->model;
//echo ' -> Propriedades: ';
$singleJoin = array();
$doubleJoin = array();
$reflect = new ReflectionClass(ucfirst($this->model));
// $props = $reflect->getProperties(ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED);
$props = $reflect->getProperties();
foreach ($props as $prop) {
print $prop->getName() . ", ";
}
$methods = $reflect->getMethods();
$array = array();
foreach ($methods as $method) {
print $method->getName() . ", ";
if ( $method->getName() == 'getHasMany') {
echo 'achou o HASMANY de ' . $this->model ;
//print_r($reflect->getHasMany());
$hasManyMethod = $reflect->getMethod('getHasMany');
$c = ucfirst($this->model);
$x = new $c();
$array = $hasManyMethod->invoke($x);
print_r($array);
foreach($array as $filho=>$hasManyDoFilho) {
if ( $this->informa_os_has_many($hasManyDoFilho, $this->model) ) {
$doubleJoin[] = $filho;
} else $singleJoin[] = $filho;
}
}
}
echo ' --- ';
// var_dump($props);
$results = $this->em->find(array('single join' => $singleJoin, 'double join' => $doubleJoin));
$data['results'] = $results;
$this->render($this->model, 'view', $data);
}
public function render($controller, $action, $data) {
extract($data);
echo 'require ' . $controller . '/' . $action . 'view.php';
echo 'dados recebidos: ';
print_r($data);
}
}
// echo 'Aluno: ' . class_exists('Aluno') . '<br>';
// echo 'Teste: '; var_dump(class_exists('Teste')) . '\n';
// $a = new Aluno();
// print_r ( $a->getSignificativeProperties() );
$alunoController = new AlunoController('aluno');
$alunoController->view('marcelo', 'boi', 1);
$disciplinaController = new DisciplinaController('disciplina');
$disciplinaController->view('PHP', 55);
preferences:
48.06 ms | 402 KiB | 5 Q