Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Razdvajanje slojeva aplikacije u PHPu

[es] :: PHP :: Razdvajanje slojeva aplikacije u PHPu

[ Pregleda: 7647 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

NikolaVeber
NikolaVeber
neradnik na porodiljskom bolovanju
Karlsruhe

Član broj: 5115
Poruke: 1254
*.rz.uni-karlsruhe.de.

Jabber: nikolaveber@jabber.org
ICQ: 121532865


Profil

icon Razdvajanje slojeva aplikacije u PHPu20.06.2006. u 20:38 - pre 216 meseci
Pozdrav!

Zanima me u kolikoj meri pristupate razdvajanju slojeva aplikacije, odnosno kako je to optimalno izvesti u PHPu.

Pri tome stavljam naglasak na potpuno razdvajanje prezentacionog i logickog sloja, sto za rezultat ima :
- mogucnost koriscenja iste logike sa vise klijenata (na primer: web, j2me aplikacija, desktop aplikacija)
- mogucnost migracije logickog sloja na pogodniju platformu (recimo sto se performansi / robustnosti tice) bez potrebe da se menja prezentacioni sloj.

Meni prvo na pamet pada SOA, dakle svu komunikaciju izmedju prezentacionog i logickog sloja realizovati koriscenjem web servisa. Sta ostali misle?

Takodje je pitanje kako razdvojiti logicki sloj od baze podataka? Da li je koriscenje Pear::DB dovoljno?


Toliko za sada.


logicki sloj := Business logic layer, sloj poslovne logike mi je malo trulo zvucalo, kao i sloj biznis logike


EDIT:

Evo i par linkova:
http://www.tonymarston.net/php-mysql/infrastructure.html
http://www.xml.com/pub/a/ws/2003/09/30/soa.html

[Ovu poruku je menjao NikolaVeber dana 20.06.2006. u 22:29 GMT+1]
Pop Servis "Paradise Tours"
Java User Group Karlsruhe
IT Dan - Srbija

Officer, I saw the driver who hit me - his name was Johnny Walker.
 
Odgovor na temu

Gojko Vujovic
Amsterdam, NL

Administrator
Član broj: 1
Poruke: 13651



+165 Profil

icon Re: Razdvajanje slojeva aplikacije u PHPu20.06.2006. u 20:45 - pre 216 meseci
Odlična tema, voleo bih da sam znao nešto više o tome kad je ES nastajao.
 
Odgovor na temu

SmilieBG
Aleksandar Skodric
NL

Član broj: 13094
Poruke: 1821
*.speed.planet.nl.



+3 Profil

icon Re: Razdvajanje slojeva aplikacije u PHPu20.06.2006. u 22:30 - pre 216 meseci
Na poslu imamo aplikaciju koja je centralni deo registracije domena + pratecih usluga (hosting, e-mail i slicno).

Sama aplikacija je radjena u PHP-u, ima 2 GUI-a: za costumer service i drugi za web sajt (online registracija). Spona izmedju ova dva je sam PHP. Medjutim, svi drugi serveri / servisi su uradjeni po principu webservisa. Preko web servisa pozivamo gotovo sve drugo, dok mi u samoj aplikaciji cuvamo (mysql) podatke o musteriji, domenu i uslugama koje ima.

Primera radi, servise koje pozivamo su:
DNS server, LDAP, mail server, hosting platforma...

Tako da apsolutno podrzavam i shvatam znacaj viseslojne php aplikacije :)

Mislim da, koliko god se cinio projekat malim, da ga treba na ovaj nacin praviti flexibilnim od samog starta :)

Poz,
Sale
=========
Uporedi cene i karakteristike za vise od 10.000 proizvoda, izmedju ostalog:
Digitalni foto-aparati
Mobilni telefoni
Skolski pribor
=========
 
Odgovor na temu

NikolaVeber
NikolaVeber
neradnik na porodiljskom bolovanju
Karlsruhe

Član broj: 5115
Poruke: 1254
*.sap-ag.de.

Jabber: nikolaveber@jabber.org
ICQ: 121532865


Profil

icon Re: Razdvajanje slojeva aplikacije u PHPu21.06.2006. u 09:48 - pre 216 meseci
Evo da pocnemo raspravu konkretnijim pitanjem:


Razdvajanje Sloja podataka od sloja logike.

Dakle, da li je koriscenjem apstrakcije baze podataka (recimo DB paket iz peara) postignuto razdvajanje ta dva sloja?
Ovakav pristup omogucava promenu DBMS-a bez izmena u kodu. Da li je potrebno ici dalje sa ovim razdvajanjem?

Recimo definisati objektni model sa svim potrebnim logickim funkcijama (recimo, tel imenik: nadjiAdresuZaBroj(), nadjiBrojZaIme(), nadjiImeZaBroj() i tako dalje) i to onda zapakovati u poseban "modul" sa web servisom kao interfejsom?
To bi omogucilo koriscenje izvora podataka koji se ne oslanjaju na SQL (drugi web servisi, RSS feedovi, textualni fajlovi...), kao i kombinovanje razlicitih izvora podataka razlicitih vrsta...

Tako bi za svaku novu vrstu izvora podataka bilo potrebno dodati web servis sa pratecom logikom na nivou pristupa podataka - dok bi interfejs servisa bio identican ostalima...
Pop Servis "Paradise Tours"
Java User Group Karlsruhe
IT Dan - Srbija

Officer, I saw the driver who hit me - his name was Johnny Walker.
 
Odgovor na temu

utvara
Slobodan Utvić
Vivvo CMS lead developer, Spoonlabs
d.o.o. Beograd

Član broj: 677
Poruke: 87
..mtsns-ns.customer.sbb.co.yu.

Jabber: utvara@elitesecurity.org
ICQ: 28140625
Sajt: utvara.blogspot.com


Profil

icon Re: Razdvajanje slojeva aplikacije u PHPu21.06.2006. u 15:31 - pre 216 meseci
Slojevi u razvoju PHP web aplikacije by utvara :))

- SQL (PEAR:MDB2)
- XML generator
- XSL transformacije (XHTML, WAP, PDF....)
- css

- Za komunikaciju sa JS (AJAX)/Flash-om razmisljam o implementaciji XML-RPC-a u svoje projekte

Ako ima zaineresovanih, mogu vam detaljnije opisati iskusva sa takvom postavkom.

poz, utvara
 
Odgovor na temu

zweistein2
Nikola Plejić
Web developer
Pula / HR

Član broj: 98247
Poruke: 14
*.adsl.net.t-com.hr.

ICQ: 161202879
Sajt: zweistein.wordpress.com


Profil

icon Re: Razdvajanje slojeva aplikacije u PHPu21.06.2006. u 15:44 - pre 216 meseci
Citat:
utvara: Ako ima zaineresovanih, mogu vam detaljnije opisati iskusva sa takvom postavkom.


Uvijek ima zainteresiranih, samo daj! :) Zanimljiv mi je ovaj tvoj način, baš bih volio čuti malo više o njemu.
 
Odgovor na temu

NikolaVeber
NikolaVeber
neradnik na porodiljskom bolovanju
Karlsruhe

Član broj: 5115
Poruke: 1254
*.sap-ag.de.

Jabber: nikolaveber@jabber.org
ICQ: 121532865


Profil

icon Re: Razdvajanje slojeva aplikacije u PHPu03.07.2006. u 09:50 - pre 216 meseci
Ziva diskusija, nema sta :)
Pop Servis "Paradise Tours"
Java User Group Karlsruhe
IT Dan - Srbija

Officer, I saw the driver who hit me - his name was Johnny Walker.
 
Odgovor na temu

boccio
Boris Krstović
Spoonlabs.com
nbgd

Član broj: 7594
Poruke: 2458
..shall-bg.customer.sbb.co.yu.

Sajt: bocc.io


+771 Profil

icon Re: Razdvajanje slojeva aplikacije u PHPu03.07.2006. u 11:02 - pre 216 meseci
Citat:
zweistein2: Uvijek ima zainteresiranih, samo daj! :) Zanimljiv mi je ovaj tvoj način, baš bih volio čuti malo više o njemu.

Cuces... kad se utvara sledeci put loguje na ES, negde 2008-me :)

Citat:
utvara: Slojevi u razvoju PHP web aplikacije by utvara :))

- SQL (PEAR:MDB2)
- XML generator
- XSL transformacije (XHTML, WAP, PDF....)
- css

- Za komunikaciju sa JS (AJAX)/Flash-om razmisljam o implementaciji XML-RPC-a u svoje projekte

Ako ima zaineresovanih, mogu vam detaljnije opisati iskusva sa takvom postavkom.

poz, utvara

Lepo ti opisa Vivvo model... jos kazes tvoje projekte?! hm...popricacemo o ovome :)

[Ovu poruku je menjao boccio dana 03.07.2006. u 12:13 GMT+1]
Jeff, one day you’ll understand that it’s harder to be kind than clever.
 
Odgovor na temu

utvara
Slobodan Utvić
Vivvo CMS lead developer, Spoonlabs
d.o.o. Beograd

Član broj: 677
Poruke: 87
..mtsns-ns.customer.sbb.co.yu.

Jabber: utvara@elitesecurity.org
ICQ: 28140625
Sajt: utvara.blogspot.com


Profil

icon Re: Razdvajanje slojeva aplikacije u PHPu03.07.2006. u 22:28 - pre 216 meseci
Citat:
boccio: Lepo ti opisa Vivvo model... jos kazes tvoje projekte?! hm...popricacemo o ovome :)


Izvinjavam se sefe, ali ako malo bolje pogledate, model se nesto malo razlikuje od Vivvo modela :P. Mada sam predlagao taj model, no imam utisak da je i Vivvo telmplate framework zanimljiv projekat ako se ne ide na XML+XSL model (kome licno dajem prednost).

Takodje se izvinjavam zainteresovanim zbog kasnjenja. Pokusavam da najdem vremena da disem, necu da zbrzam, hocu da napisem odgovor kako treba, sa primerima...

Nadam se pre 2008 o veliki moderatore :D

poz, utvara
 
Odgovor na temu

utvara
Slobodan Utvić
Vivvo CMS lead developer, Spoonlabs
d.o.o. Beograd

Član broj: 677
Poruke: 87
..mtsns-ns.customer.sbb.co.yu.

Jabber: utvara@elitesecurity.org
ICQ: 28140625
Sajt: utvara.blogspot.com


Profil

icon Re: Razdvajanje slojeva aplikacije u PHPu15.07.2006. u 01:17 - pre 216 meseci
Pristup koji sam u svojio prilikom izrade web sajta je u sustini izgradnja web servisa, razvoj svojih xml dokumenata (shema), kao i što transparentiji povezivanje shema i relacione baze. Kako za MySQL ne postoji jednostavan način transformacije relacione tabele u XML dokument (zbog razlika je u strukturi drveta i table) počeo sam da izgradjujem svoje klase koje bi se orađivale tu transofrmaciju.
Ne mogu se pohvaliti da sam napravio bas najsretniji način strukturiranja tabele u stablo. Koristim array za opis transformacije (grupisanje podčvorova). Prirodniji pristup bi verovatno bio da za opis te strukture koristim objekte, ali jednostavno nisam nasao vremena da razvijem klase za opis te transformacije.

Code:

class SQL_get extends SQL_connection{
    var $data;                 // SQL result data holder
        
// izvrsava sql komandu i rezultat smesta u $this->data array, rezultati se smestaju kao 
// data[0][ime],data[0][id],data[1][name]....

    function sql_query($sql){
        if ($result = mysql_query($sql)){
            return true;
        }else{
            return false;
        }
    }
    
    function sql_get_data($sql){
        if ($result = mysql_query($sql)){
            $i = 0;
            while ($i < mysql_num_fields($result)) {
                $meta[$i] = mysql_field_flags($result,$i);
                $i++;
            }
            $i=0;        
            while ($row = @mysql_fetch_array($result, MYSQL_ASSOC)) {
                $j=0;
                foreach ($row as $k => $v) {
                        if (strpos($meta[$j],'set')=== false) {
                            $this->data[$i][$k]=$v;
                        }else{
                            $this->data[$i][$k] = explode(",",$v);
                        }
                        $j++;
                }
                $i++;
            }
            return true;
        }else{
             $this->error_loging("Invalid query: " . mysql_error(), $sql);
             return false;
        }
    }

    function xml_set_walk(&$dom,$tag_name='',&$node,$key,$depth='',$loop_key=''){
        do {
            $new_node = $node->append_child($dom->create_element($tag_name));
            foreach ($depth as $field_name => $v){                                
                $v1 = $this->data[$key][$field_name];
                
                if (is_array($v1)){
                    foreach ($v1 as $v2) {
                        $temp = $new_node->append_child($dom->create_element($v['tag_name']));
                        $temp->append_child($dom->create_text_node($v2));    
                    }
                }else{
                    $temp = $new_node->append_child($dom->create_element($v['tag_name']));    
                    $temp->append_child($dom->create_text_node($v1));    
                }
                
                if (isset($v['__depth']) && is_array($v['__depth'])){        
                    $key = $this->xml_set_walk($dom,$v['__depth_tag'],$new_node,$key,$v['__depth'],$field_name) -1;
                }
            }
            $key ++;
        }while ($loop_key!='' && ($this->data[$key][$loop_key]===$this->data[$key-1][$loop_key]));
        return $key;        
    }

    function xml_set($main_tag='', $depth = null){
        if ($main_tag=='') $main_tag = get_class($this);        
                
        $main_node = $this->xml;

        if ($this->data) {
            if (!is_array($depth)){
                foreach ($this->data as $k => $v) {
                    $fc = $main_node->append_child($this->dom_doc->create_element($main_tag));
                    foreach ($v as $k1 => $v1) {
                        if (is_array($v1)){
                            foreach ($v1 as $v2){
                                if (is_a($v2,"DOMNode")){                                    
                                    $temp_child = $v2->clone_node(true);
                                    $fc->append_child($temp_child);
                        
                                }else{
                                    $temp = $fc->append_child($this->dom_doc->create_element($k1));
                                    $temp->append_child($this->dom_doc->create_text_node($v2));    
                                }
                            }
                        }else if (is_a($v1,"DOMNode")){
                            $temp_child = $v1->clone_node(true);                            
                            $tmp = $fc->append_child($temp_child);
                        }else{
                            $temp = $fc->append_child($this->dom_doc->create_element($k1));
                            $temp->append_child($this->dom_doc->create_text_node($v1));    
                        }
                    }
                }

            }else{
                $key = 0;
                while ($key < count($this->data)){
                    $key = $this->xml_set_walk($this->dom_doc,$main_tag,$main_node,$key,$depth);
                }
            }
        }
    }    
    
// konstruktor
    function SQL_get( &$dom_doc, &$doc_element, $sql=NULL,$main_tag=''){
        $this->set_dom_doc($dom_doc);
        $this->set_dom_element($doc_element);
        $this->SQL_connection();
        if ($sql && $this->sql_connected) {
            $this->sql_get_data($sql);
        }
    }



Kao što možete primetiti u gornjem kodu nije korišćen PEAR:MDB2 trenutno se upoznajem sa njim i verovatno ću ga nadalje koristiti.

Samo mapiranje izgleda odprilike ovako:

Code:

$arr = array ('id' => array ('tag_name' => 'id' , '__depth_tag' => 'proizvodi', '__depth' =>
                        array ( 'naziv' => array ('tag_name' => 'naziv'),
                                'pid' => array ('tag_name' => 'id'),
                            )
                        ),
                    'edition_id' => array ('tag_name' => 'edition_id'),
                    'visible' => array ('tag_name' => 'visible'),
                    'name' => array ('tag_name' => 'name'),
            );


Pristup koji mi se jako svideo nažalost potice od mrskog nam M$ je vezan za SQLXML, elem oni koriste prošireni XSD da dokumentuju u okviru sheme koji nod se za koje SQL polje vezuje.

http://msdn2.microsoft.com/en-us/library/ms171779.aspx

Code:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
  <xsd:element name="Contact" sql:relation="Person.Contact" >
   <xsd:complexType>
     <xsd:sequence>
        <xsd:element name="FName"
                     sql:field="FirstName" 
                     type="xsd:string" /> 
        <xsd:element name="LName"  
                     sql:field="LastName"  
                     type="xsd:string" />
     </xsd:sequence>
        <xsd:attribute name="ConID" 
                       sql:field="ContactID" 
                       type="xsd:integer" />
    </xsd:complexType>
  </xsd:element>
</xsd:schema>


Nešto na tragu onoga što sam radio:
http://pear.php.net/package/XML_sql2xml

Ovo je na brzinu kako generišem XML dokumente iz baze podataka, pored toga razvio sam par klasa za generisanje XML podataka iz fajl sistema (ID3 tagovi iz MP3 fajlova, naslovi, autor, datumi iz PDFova, EXIF iz slika...) i direktno korišćenje xml fajlova kao izvora podataka.

Uskoro o XSL transformacijama (tj. zanimljivi deo priče)

poz, utvara
 
Odgovor na temu

liban0n
coder4u.blogspot.com

Član broj: 2731
Poruke: 206
*.dsl.iskon.hr.



Profil

icon Re: Razdvajanje slojeva aplikacije u PHPu19.01.2007. u 10:04 - pre 209 meseci
Pozz, ako se smijem ukljuciti.

Takodjer i ja prilikom izrade aplikacija za web pokusavam razdvajati logicku strukturu od dizajna.

U velike tu koristim ADODB koji se pokazao makar meni jako dobar i flexibilan pogotovo sa ActiveRecordom s kojim stvarno stvar ide 5 puta lakse. Kad se tu ukonbinira smarty programiranje nikad lakse :)


Code:

Ovo je klasa za konekciju na bazu...

class Database {
    
   /** 
    *
    * @access private 
    * @var object
    * @static 
    */
    static $singleton;
    
    /**
    * Singleton pattern for database connection
    *
    * @return ADONewConnection
    * @access public
    * @static
    */
    static public function getInstance($charset = 'utf8') {
        if(!is_object(self::$singleton)) {
            self::$singleton = &ADONewConnection('mysql');
            self::$singleton->debug = false;
            self::$singleton->SetFetchMode(2);
            self::$singleton->Connect(DbConfig::$host, 
                                      DbConfig::$user,
                                      DbConfig::$pass,
                                      DbConfig::$db);
                                      
            self::$singleton->query("SET CHARACTER SET '{$charset}'");
        }
        
        return self::$singleton;
    }
}


Sve kasnije radnje idu :

Database:getInstance()->query($SQL);

njih vracam u PHP ArrayObject(); i njega prosljedim smartyu :)

Code:

    
       if($result = Database::getInstance()->query($aSQL)) 
                {
                    while(!$result->EOF) {
                    $branches->append($row = $result->FetchNextObj());
                    }
                }

---------------------------------
Blog of mine http://coder4u.blogspot.com/
 
Odgovor na temu

[es] :: PHP :: Razdvajanje slojeva aplikacije u PHPu

[ Pregleda: 7647 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.