Bonjour,

Je vais sûrement passer pour un c.. mais il n'est jamais trop tard pour réctifier le tire ^^

Donc j'utilise une architecture semblable à celui vu dans le tuto sur le modele mvc.

Depuis plusieurs mois déjà, lorsque je créais des tables, j'ajoutais un fichier ...Table.php et un fichier ...Entity.php en laissant ce dernier vide juste extends class entity.

Sans ce fichier, j'obtiens une erreur php. Donc ma question est à quoi sert ce fichier ? Comment l'utiliser ? J'ai revu cette partie dans la video de grafikart mais je n'ai toujours pas pigé !

Merci d'avance pour vos réponses !

10 réponses


betaWeb
Réponse acceptée

Salut,

En fait c'est le contraire de ce que dis @Sparkosis (même si sa logique était bonne ^^): la classe ...Entity représente un entité de ta table (un enregistrement si tu préfères) et celle-ci hérite de la classe ...Table qui représente la table de manière générale. Elle accueillera la logique inhérente à la table et non à l'entitée (par ex. si tu veux créer une méthode permettant de truncate la table, elle aura toute sa place dans la classe ...Table car elle affectera ta table dans son entier et pas seulement un enregistrement en particulier).

En gros c'est pour séparer la logique :)

Petit exemple pour expliquer la logique du truc (cela n'a rien à voir avec la structure de code des tutos de @Grafikart, c'est juste pour expliquer la logique) :

// classe Table, qui gère les tables de manière générale
namespace \App\Table;

class Table
{
    public function query()
    {
        // Le code ici...
    }
}

// classe PostTable, qui gère la table dans son ensemble
namespace \App\Table;

use \App\Entity\PostEntity; // exemple de namespace

class PostTable extends Table
{

    public $table = "posts";

    public function all()
    {
        // On part du principe que la métode query() retourne ici un tableau de résultats
        $results = $this->query('SELECT * FROM ' . $this->table);
        $data = [];
        foreach(results as $result)
        {
            $data[] = new PostEntity($result);
        }
        return $data;
    }

    public function truncate()
    {
        // du code ici ...
        $truncate = $this->query('TRUNCATE ' . $this->table);
        // du code ici ...
    }
}

// classe PostEntity, qui gère un enregistrement
namespace \App\Entity;

class PostEntity extends Entity
{

    public $entity;

    public function __construct ($entity)
    {
        Parent::construct(); // pas forcément utile si tu n'as pas de constructeur dans ta classe entity
        $this->entity = $entity;
    }

    public function getTitle()
    {
        return $this->entity->title;
    }

}

En tout cas c'est comme ça que j'aurais fait les choses perso. Je ne me rappelle plus de l'architecture du projet de Grafikart pour cette série de tutos ^^

Si ce n'est pas clair, n'hésite pas ;)

Salut, la classe entity est apparement une class parente ce qui, permet à ta classe ..Table.php d'hériter de toute les méthodes et possibilité de la class entity (j'ai pas regarder le tuto donc sans code c'est difficile de mieux t'expliquer)

cid5420
Auteur

Ok merci de ta réponse, mais concrètement, je mets quoi dans mes fichiers ..entity? je les laisse vide ?

Voici un bout de code de ma class Table :

public function query($statement, $attribute = null, $one = false)
    {
        if($attribute){
            return $this->db->prepare(
                $statement,
                $attribute,
                str_replace('Table', 'Entity', get_class($this)),
                $one
            );
        }else{
            return $this->db->query(
                $statement,
                str_replace('Table', 'Entity', get_class($this)),
                $one
            );
        }
    }

et voici le code de ma class Entity :

<?php
namespace Core\Entity;

class Entity
{
    public function __get($key)
    {
        $method = 'get'.ucfirst($key);
        $this->$key = $this->$method();
        return $this->$key;
    }
}

Oups ouep mes excuses pour le coup j'avais mal compris ^^"

cid5420
Auteur

désolé je comprends pas bien, du coup si je souhaites faire la recherche d'un élément, il est préférable de le faire dans mon fichier Entity (je dois faire l'inverse depuis le début dans ce cas)? En fait je comprends mieux avec des exemples...

J'ai edit mon exemple, peut-être que tu comprendras mieux ;)

cid5420
Auteur

OK je comprends mieux ! Donc c'est ce que je faisais, sauf pour la party entity. En fait lorsque j'ai besoin d'un élément, je vais le chercher depuis mon controller, je charge la méthode de la table dont j'ai besoin :

$user = $this->Users->find($login, $pass);

et ensuite si je souhaite utiliser cet objet je fais:

echo $user->name;

Donc du coup quel est l'interêt de l'écrire dans le fichier entity ? Et quel est le principe d'utilisation entre l'entity et le controller ?

Le controller accueillera ta logique métier, tandis que tes entités vont gérer la logique sur les données (si je ne me trompe pas).
Après, normalement, si tu fais une query via la méthode query(), tout doit s'instancier à la volée toi tu récupères juste le jeu de résultats (il me semble si mes souvenirs sont bons, que c'est comme ça que ça fonctionne)

cid5420
Auteur

ok c'est bon je comprends mieux merci en tout cas !

Avec plaisir ;)