KO3: Pretend Eigenschaften auf einem Kohana_ORM Modell
-
01-10-2019 - |
Frage
Sprich ich habe ein sehr einfaches Modell, das wie folgt aussieht:
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,
);
*/
}
Gibt es eine Möglichkeit, ich kann ich das für ein pretend Grundstück mit dem vollständigen Namen hinzufügen?
Damit ich zum Beispiel könnte dies tun:
$person = ORM::factory('person', 7);
echo $person->fullname;
anstelle dieses:
$person = ORM::factory('person', 7);
echo $person->firstname.' '.$person->lastname;
Ein weiteres Beispiel könnte eine is_young
Eigenschaft sein, die die Personen Alter berechnen würden und return true, wenn das Alter unter einer bestimmten Zahl ist.
Lösung
Sie können "Magie" __get()
Methode wie folgt verwendet werden:
public function __get($column)
{
switch($column)
{
case 'fullname' :
return $this->firstname.' '.$this->lastname;
case 'is_young' :
// calculate persons age
}
return parent::__get($column);
}
Sie können auch zusätzliche Methoden erstellen wie fullname()
und age()
(scheint mir besser).
Andere Tipps
Warum diese Lösung nicht verwenden?
class Model_Person extends ORM
{
public function fullname()
{
return $this->firstname.' '.$this->lastname;
}
}
$person = ORM::factory('person', 1);
echo $person->fullname();
Sie können die folgenden in application/classes/ORM.php
tun
(application/classes/orm.php
für Kohana vor 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);
}
}
Dann können Sie nur eine Methode, um Ihre Modellklasse hinzuzufügen:
public function get_fullname() {
return $this->firstname . ' ' . $this->lastname;
}
Und in der Lage sein, darauf zuzugreifen als Eigenschaft.