Skip to content

Commit

Permalink
Merge pull request #122 from kivudesign/refactor_trait
Browse files Browse the repository at this point in the history
[ENH] refactoring entity reflexion to avois duplication
  • Loading branch information
bim-g authored Aug 30, 2023
2 parents e402fb6 + e6a30ff commit 632fae6
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 64 deletions.
1 change: 0 additions & 1 deletion controller/homeController.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
use Wepesi\Core\Redirect;
use Wepesi\Core\Session;


class homeController{

/**
Expand Down
78 changes: 31 additions & 47 deletions src/Core/Orm/EntityModel/EntityReflexion.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,69 +9,53 @@
*/
trait EntityReflexion
{
/**
* @param EntityInterface $entity
* @return array
*/
private function getEntityName(EntityInterface $entity): array
{
try {
$reflexion = new \ReflectionClass($entity);
$object = $reflexion->newInstance();
$method = $reflexion->getMethod('getTableName');
$class_name = strtolower($reflexion->getShortName());
$method->setAccessible(true);
return ['table' => $method->invoke($object),'class' => $class_name];
} catch (\Exception $ex) {
return ['exception' => $ex->getMessage()];
}
}

/**
* @param string $entity_array
* @return array|mixed
*/
private function getEntityRelationLink(array $entity_array)
{
try {
$reflexion = new \ReflectionClass($this);
$object = $reflexion->newInstance();
$table_name = $entity_array['table'];
$class_name = $entity_array['class'];
if ($reflexion->hasMethod($table_name)){
$method = $reflexion->getMethod($table_name);
$method->setAccessible(true);
} else if ($reflexion->hasMethod($class_name)){
$method = $reflexion->getMethod($class_name);
$method->setAccessible(true);
}else{
throw new \Exception('You should implement a relation method for the ' . $class_name);
}
return $method->invoke($object);
} catch (\Exception $ex) {
return ['exception' => $ex->getMessage() . ' from class ' . $this->getClassDefinition($this)->class];
}
}

/**
* @param EntityInterface $entity
* @return object|array
*/
private function getClassDefinition($entity): object
private function getClassDefinition($entity, bool $entity_relation=false,bool $entity_name=false)
{
try {
$reflexion = new \ReflectionClass($entity);
$class_name = $reflexion->getShortName();
$classEntity = $reflexion->getShortName();
$table_name = strtolower($reflexion->getShortName());
$table_field = [];
$entity_object = null;
$method = null;
foreach ($reflexion->getProperties(\ReflectionProperty::IS_PUBLIC) as $property) {
$propertyName = $property->getName();
$table_field[] = $propertyName;
}
if($entity_relation){
$object = $reflexion->newInstance();
$class_name = strtolower($classEntity);
$method = $reflexion->getMethod('getTableName');
$method->setAccessible(true);
$get_table_name = $method->invoke($object);
//
$this_reflexion = new \ReflectionClass($this);
$object = $this_reflexion->newInstance();
if ($this_reflexion->hasMethod($get_table_name)){
$method = $this_reflexion->getMethod($get_table_name);
$method->setAccessible(true);
} else if ($this_reflexion->hasMethod(($class_name))){
$method = $this_reflexion->getMethod($class_name);
$method->setAccessible(true);
}else{
throw new \Exception('You should implement a relation method for the ' . $class_name .' from class '. $classEntity);
}
$entity_object = $method->invoke($object);
}elseif ($entity_name){
$object = $reflexion->newInstance();
$method = $reflexion->getMethod('getTableName');
$method->setAccessible(true);
$table_name = $method->invoke($object);
}
return (object)[
'table' => $table_name,
'fields' => $table_field,
'class' => $class_name
'entity_object' => $entity_object,
'class' => $classEntity,
];
} catch (\Exception $ex) {
return ['exception' => $ex->getMessage()];
Expand Down
26 changes: 12 additions & 14 deletions src/Core/Orm/EntityModel/Provider/Entity.php
Original file line number Diff line number Diff line change
Expand Up @@ -147,24 +147,22 @@ public function orderby(string $field_name): Entity
public function include(EntityInterface $entityName, bool $inner = false): Entity
{
try {
$entity_table_name = $this->getEntityName($entityName);
if (isset($entity_table_name['exception'])) {
throw new \Exception($entity_table_name['exception']);
$entity_table_object = $this->getClassDefinition($entityName,true);
if (is_array($entity_table_object) && isset($entity_table_object['exception'])) {
throw new \Exception($entity_table_object['exception']);
}
$entity_object = $this->getEntityRelationLink($entity_table_name);
$entity_object = $entity_table_object->entity_object;
$relation = [
'entity' => $entity_object ?? $entity_table_name['table'],
'table' => $entity_table_name['table'],
'entity' => $entity_object ?? $entity_table_object->table,
'table' => $entity_table_object->table,
'join' => $inner ? 'INNER' : 'LEFT',
];
if (is_array($entity_object) && isset($entity_object['exception'])) {
throw new \Exception($entity_object['exception']);
} else {
$entity_relation = $entity_object->getRelation();
$primary_key = $this->getTableName() . '.' . $entity_relation->primary_key;
$foreign_key = $entity_table_name['table'] . '.' . $entity_relation->foreign_key;
$relation['on'] = ' ON ' . $primary_key . '=' . $foreign_key;
}

$entity_relation = $entity_object->getRelation();
$primary_key = $this->getTableName() . '.' . $entity_relation->primary_key;
$foreign_key = $entity_table_object->table . '.' . $entity_relation->foreign_key;
$relation['on'] = ' ON ' . $primary_key . '=' . $foreign_key;

$this->include_entity [] = $relation;
} catch (\Exception $ex) {
print_r(['exception' => $ex->getMessage()]);
Expand Down
4 changes: 2 additions & 2 deletions src/Core/Orm/Relations/BaseRelation.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ abstract class BaseRelation
*/
public function __construct(EntityInterface $entity_parent, EntityInterface $entity_child)
{
$this->parent_table = $this->getEntityName($entity_parent)['table'];
$this->child_table = $this->getEntityName($entity_child)['table'];
$this->parent_table = $this->getClassDefinition($entity_parent,false,true)->table;
$this->child_table = $this->getClassDefinition($entity_child,false,true)->table;
$this->table_relations = [];
}
/**
Expand Down

0 comments on commit 632fae6

Please sign in to comment.