Dynamické proměnné modelu
- baz
- Člen | 42
Ahoj,
zkouším novou verzi NETTE a zároveň se pokouším obejít bez DIBI.
Ale velmi mi chybí chování objektu DibiRow, které umí na základě pole
generovat proměnné do dané třídy.
Ve zdrojáku DibiRow jsem našel:
public function __construct($arr)
{
foreach ($arr as $k => $v) $this->$k = $v;
}
Když se ale o to samé pokusím ve své tříde:
class QUser extends NObject {
private $db;
public function __construct(NConnection $db, Array $fill = NULL)
{
$this->db = $db;
if($fill) {
dump($fill);
foreach($fill as $key => $val) {
$this->$key = $val;
}
}
}
hodí mi to tuhle chybu:
Cannot write to an undeclared property QUser::$id
Existuje nějaká možnost, jak tohle zprovoznit?
Pole, ze kterého vytvářím objekt je dost dlouhé a chtěl bych se vyhnout
definování všech proměnných…
Díky za odpověď,
Otto
Editoval baz (8. 6. 2012 23:17)
- bojovyletoun
- Člen | 667
Nevím, zda je tento přístup nejlepší, ale k dotazu:
1.Cannot write to an undeclared property to je vlastnost Object, stačí
nedědit OBject
2. využít magii __get, __set a property $data. – podobně jako zde Nette\Http\SessionSection::set()
Editoval bojovyletoun (8. 6. 2012 23:27)
- baz
- Člen | 42
Přiznám se, že si taky nejsem jist jestli to je správný přístup, ale nenapadají mě rizika, nebo důvody proč to psát ručně…
Každopádně díky za nasměrování, inspiroval jsem se nápovědou číslo 2 a vytvořil něco takového:
private $data;
public function &__get($name)
{
try {
return parent::__get($name);
} catch (MemberAccessException $e) {
return $this->data[$name];
}
}
public function __set($name, $value)
{
try {
return NObjectMixin::set($this, $name, $value);
} catch(MemberAccessException $e) {
return $this->data[$name] = $value;
}
}