KO3: propriétés Pretend sur un modèle Kohana_ORM
-
01-10-2019 - |
Question
Dire que j'ai un modèle très simple qui ressemble à ceci:
class Model_Person extends ORM
{
/*
CREATE TABLE `persons` (
`id` INT PRIMARY KEY AUTO_INCREMENT,
`firstname` VARCHAR(45) NOT NULL,
`lastname` VARCHAR(45) NOT NULL,
`date_of_birth` DATE NOT NULL,
);
*/
}
Est-il possible que je puis-je ajouter une sorte de propriété faire semblant avec le nom complet?
Alors que je pourrais par exemple faire ceci:
$person = ORM::factory('person', 7);
echo $person->fullname;
au lieu de ceci:
$person = ORM::factory('person', 7);
echo $person->firstname.' '.$person->lastname;
Un autre exemple pourrait être une propriété is_young
qui calcule l'âge des personnes et de retour vrai si l'âge était inférieur à un certain nombre.
La solution
Vous pouvez utiliser la méthode __get()
"magique" comme ceci:
public function __get($column)
{
switch($column)
{
case 'fullname' :
return $this->firstname.' '.$this->lastname;
case 'is_young' :
// calculate persons age
}
return parent::__get($column);
}
Vous pouvez également créer d'autres méthodes comme fullname()
et age()
(semble mieux me).
Autres conseils
Pourquoi ne pas utiliser cette solution?
class Model_Person extends ORM
{
public function fullname()
{
return $this->firstname.' '.$this->lastname;
}
}
$person = ORM::factory('person', 1);
echo $person->fullname();
Vous pouvez effectuer les opérations suivantes dans application/classes/ORM.php
(application/classes/orm.php
pour Kohana avant 3,2):
<?php
class ORM extends Kohana_ORM {
public function __get($name) {
$getter = 'get_' . $name;
if (method_exists($this, $getter)) {
return $this->$getter();
}
return parent::__get($name);
}
}
Ensuite, vous pouvez simplement ajouter une méthode à votre classe de modèle:
public function get_fullname() {
return $this->firstname . ' ' . $this->lastname;
}
Et être en mesure d'y accéder comme une propriété.