Tu n'as pas besoin de redéfinir "searchElement" dans les enfants
car ta méthode est générique, tu dois redéfinir simplement la propriété
table et entity dans ta classe enfant. Tu ne passeras pas directement par
ton CRUD pour utiliser tes méthodes mais par les enfants.
Si tu as besoin d'une méthode plus spécifique, tu l'ajoutes à ton enfant.
public function searchElement()
{
$req = $this->getPDO()->prepare("SELECT * FROM $this->table");
$req->execute();
// Si entity est différent de null on récupère un objet pour modèle entity
// Sinon on récupère un tableau associatif
if ($this->entity != null) {
$req->setFetchMode(PDO::FETCH_CLASS, $this->entity);
}
return $req->fetchAll();
}
class UserCrud extends Crud
{
protected $table = 'users';
protected $entity = User::class;
}
PDO va remplir les propriétés de ta classe user et donc tu auras un objet pour modèle user
Si tu fais:
$users = $this->userCrud->searchElement();
Tu récupères un array d'objet user
Pour la partie update:
On récupère l'utilisateur
$user = $this->userCrud->findUser($datas);
Il faut envoyer l'adresse e-mail de l'utilisateur pour mettre à jour le last_login
$this->userCrud->updateUser($user->getEmail());
Dans updateUser tu fais ta requète pour mettre à jour le last_login WHERE l'email recu mais nous pourrions également utiliser directement la méthode updateUser dans la méthode findUser.
La récupération d'un utilisateur est plus spécifique donc tu ajoutes une méthode dans ta classe userCrud
mais par la suite tu pourras rendre dynamique la prise en compte des champs afin de faire des méthodes les plus génériques possible
Par exemple:
public function update(int $id, array $params): void
{
$fieldQuery = implode(', ', array_map(function ($field) {
return "$field = :$field";
}, array_keys($params)));
$sql = "UPDATE $this->table SET $fieldQuery WHERE id = $id";
$s = $this->pdo->prepare($sql);
$params['id'] = $id;
$s->execute($params);
}
Le setter te renvoie simplement la valeur de la propriété privée, tu pourrais très bien avoir
public $email;
et faire
$user->email;
au lieu de
$user->getEmail();
Pour les setters, tu pourrais par exemple à la création d'un utilisateur hydrater ton objet avec les champs recu
de ton formulaire
$user = new User();
$user->setEmail($_POST['email']);
$user->setName($_POST['name']);
etc,...
et envoyer ton utilisateur dans une méthode create
$this->userCrud->create($user);
Dans cette méthode, tu récupères les données de l'utilisateur afin de les encoders dans ta base de donnée avec ta requète INSERT
$user->getEmail();
$user->getName();
etc,...