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
+
0
-

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.

redhead
Člen | 1313
+
0
-

jj, používám nějakou dobu něco podobného..

romansklenar
Člen | 655
+
0
-

Bohužel tyto řešení nejsou stoprocentní

Roman Ožana
Člen | 52
+
0
-

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
  }
?>