Statické modely v PHP 5.2 i 5.3 aneb LSB dočasné řešení
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- Roman Ožana
- Člen | 52
Zrovna pracuji na projektu, který nějaký čas poběží na PHP 5.2 a do budoucna se bude překlápět na PHP 5.3.
Chtěl jsem využít LSB a statické třídy pro modely. Přičemž jméno class bude samozřejmě jméno tabulky.
Nakonec jsem nalezl následující řešení:
<?php
abstract class BaseModel extends Object {
const prefix = ''; // tables prefix
public static function findAll() {
return dibi::select('*')->from(self::getTable());
}
public static function fetchAll($offset = null, $limit = null) {
// FIXME PHP 5.2 need new table name setup
return self::findAll()->from(self::getTable())->fetchAll($offset, $limit);
}
// atd...
public static function getTable() {
############################################################################
# PHP 5.3 using LBS
############################################################################
if (function_exists('get_called_class')) return self::prefix.get_called_class();
############################################################################
# PHP 5.2 hack for LSB
############################################################################
$bt = debug_backtrace();
$l = 0;
do {
$l++;
$lines = file($bt[$l]['file']);
$callerLine = $lines[$bt[$l]['line']-1];
preg_match('/([a-zA-Z0-9\_]+)::'.$bt[$l]['function'].'/', $callerLine, $matches);
if ($matches[1] == 'self') {
$line = $bt[$l]['line']-1;
while ($line > 0 && strpos($lines[$line], 'class') === false) {
$line--;
}
preg_match('/class[\s]+(.+?)[\s]+/si', $lines[$line], $matches);
}
} while ($matches[1] == 'parent' && $matches[1]);
return self::prefix.$matches[1]; // return Static table name
}
}
?>
Jednotlivé modely pak rozšiřují BaseModel a v presenteru můžete jednoduše psát:
<?php
Catalog::findAll(); // najdi vsechny zaznamy v tabulce catalog
?>
Pokud se ocitnete ve stejné situaci jako já, může se Vám to hodit.
- Roman Ožana
- Člen | 52
Ještě malé doplnění, které se taky může někomu hodit:
Filtr vstupních dat.
<?php
public static function filter(array $data, $table = null) {
$table = (is_null($table))?self::getTable():$table;
$c = dibi::getDatabaseInfo()->getTable($table)->getColumnNames();
return array_intersect_key($data, array_flip($c)); // get active columns
}
?>