[ alfa-pro @ 06.04.2013. 16:10 ] @
Cao drustvo, poceo sam da radim database biblioteku koja ce sadrzati razlicite drajevere tipa mysql, sqlite,mysqli itd.
To radim za sebe da bih koristio u svojim aplikacijama.

Ja se sa ovim prvi put susrecem pa mi je potrebno objasnjenje nekog ko je vec radio ovo.
Jedostavno nemogu da ukapiram sta tacno drajver treba da sadrzi od metoda. Dali svaki drajver mora da ima posebno konekciju, query upite itd. Ili to sve samo definisem u jedom fajlu i samo jedom se izvrsava.

Ja imam sledecu strukturu.

|-root
|---index.php
|---factory.php
|---database
|-----Database.php
|-----DatabaseQuery.php
|-----DatabaseException.php
|-----DatabaseForge.php
|---Driver
|----MySQL.php
|----Mysqli.php

Factory php je obican factory pattern koji mi ucitiava odredjeni drajver.
Ja sam sada zbunjen jer sam ja u Database.php stavio sve, i konekciju i upite(SELECT, INSERT,UPDATE,DELETE) dali sam uradio dobro. Ali ako ja sve gurnem u database class .php sta ce mi onda DatabaseQuery. Video sam negde da odvajaju da imaju poseban fajl query.php ili table.php pa sam i ja to uradio ali sam zakucao. A sto se tice drajvera npr mysql.php sta taj fajl konkrento treba da sadrzi..

Jedostavno ako neko moze da mi pojasni kako to funkcionise i gde stra smestam da bi ja dobio neku sliku u glavi a ne ovako sam se pogubio ne znam na koju cu stranu...

Hvala

[Ovu poruku je menjao alfa-pro dana 06.04.2013. u 17:23 GMT+1]
[ Miroslav Ćurčić @ 06.04.2013. 22:44 ] @
Ako već pišeš svoj layer onda nemoj mnogo komplikovati.

Možeš sve staviti u jednu klasu (konekciju, query-je,...), koja bi sadržavala sve funkcije u osnovnom obliku.
Potom kreiraš klasu (drajver) za MySQL koja će da proširi tu osnovnu klasu specifičnostima za MySQL, a potom to isto uradiš i za ostale engine.

Za "forge" će ti verovatno trebati dosta koda pa bi to možda mogao u zasebnu datoteku, i onako se te funcionalnosti retko pozivaju.

Svidelo mi se kako je to Drupal uradio u verziji 7, pogledaj.
[ alfa-pro @ 07.04.2013. 17:54 ] @
Znaci ja samo da u klasi database definisem konekciju i upite, fetch_array, fetch_object i neke positnice neophodne. A npr. driver MySQL nema potrebe da sadrzi ponovo konekciju i ovo za upite? i u mysql drajveru da definisem neke metode koje ce da prosire samo glavnu database klasu tipa (setCharset,getCharset itd..) ? Jel si na to mislio?
A adapter da mi bude ovaj factory pattern koji ce da initializuje (getDatabase($option)) bazu. Parametar option je niz koji bi sadrzao

Code:
$option = array(
                 'Mysql',
                 'localhost',
                 'root',
                 'test',
                 'database'
);

ili
Code:
$option = array(
                 array('driver' = 'MySQL'),
                 array('host'  = 'local'),
                 array('user'  = 'root'),
                 array('pass'  = 'test'),
                 array('db'     = 'myDb')
);



i uradim Factory

Code:
   
public static function getDatabase($driver)
    {
        if (include_once('database/driver/'.$driver.EXT)):
            return new $driver;
        else:
            throw new Exception('Database driver not found.');
        endif;
        
    }


Cek a koliko vidim i Drupal ima odvojene klase Query, Result? Zasto oni to odvajaju zasto sve nestave u jednu?
[ Miroslav Ćurčić @ 07.04.2013. 19:14 ] @
Tako je.

Što se tiče adaptera i 'factory', nasam razumeo na šta si tačno mislio, meni se najbolje pokazala sledeća varijanta...
Code:
function DB($ConnectionName='Primary') {

    static $Connections= array();

    if (!isset($Connections[$ConnectionName])) {
        // open new database connection
                $Class= izvuci iz konfiguracije 
                $Params= izvuci iz konfiguracije 
        $Connections[$ConnectionName]= new $Class($Params);
    }
        // return selected connection
    return $Connections[$ConnectionName];
}

U konfiguraciji čuvam array (ili dsn) sa parametrima za konekciju, i to u nekoliko setova, recimo ovako:
array(
'Primary'=>'MySQL:host=localhost&port=3306&dbname=mojatabela&prefix=&user=nešto&pass=nešto',
)
i koristim kao:
$Data= DB()->Query(.....)->Where(.....)->......

Kad mi zatreba konekcija ka drugoj bazi onda definišem u konf parametre za "Druga" i pozivam sa DB('Druga')->...


Što se tiče Drupala, njihov layer je dobro razrađen i robustan je i sve ukupno ima 300kb programskog koda!!!
Jednostavno su morali zbog preglednosti to razbiti u više delova.

Dakle ako bi da koristiš tešku artiljeriju onda odustani od pravljenja svog layera i koristi nešto što je već testirano, iako bi to za tebe bio overkill.
Ako bi ipak da praviš nešto svoje i pri tom da bude lite trebalo bi sve da ti stane u jednu-dve datoteke.