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

Razdvajanje slojeva aplikacije u PHPu

[es] :: Advanced PHP :: Razdvajanje slojeva aplikacije u PHPu
(TOP topic, by flylord)

[ Pregleda: 3033 | Odgovora: 10 ]

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

NikolaVeber
neradnik na porodiljskom bolovanju
Karlsruhe

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

Jabber: nikolaveber@jabber.org
ICQ: 121532865


Profil

icon Razdvajanje slojeva aplikacije u PHPu20.06.2006. u 20:38

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]
blog.sun.com/srbija
Java User Group Karlsruhe
Studiranje u Nemačkoj

Officer, I saw the driver who hit me - his name was Johnny Walker.
20.06.2006. u 20:38 

Gojko Vujovic
Juniper Networks
Amsterdam, NL

Administrator
Član broj: 1
Poruke: 13010
*.gojko.ss.

Sajt: www.gojkovujovic.com


Profil

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

SmilieBG
Aleksandar Skodric
NL

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



Profil

icon Re: Razdvajanje slojeva aplikacije u PHPu20.06.2006. u 22:30
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
20.06.2006. u 22:30 

NikolaVeber
neradnik na porodiljskom bolovanju
Karlsruhe

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

Jabber: nikolaveber@jabber.org
ICQ: 121532865


Profil

icon Re: Razdvajanje slojeva aplikacije u PHPu21.06.2006. u 09:48
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...
blog.sun.com/srbija
Java User Group Karlsruhe
Studiranje u Nemačkoj

Officer, I saw the driver who hit me - his name was Johnny Walker.
21.06.2006. u 09:48 

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
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
21.06.2006. u 15:31 

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
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.
21.06.2006. u 15:44 

NikolaVeber
neradnik na porodiljskom bolovanju
Karlsruhe

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

Jabber: nikolaveber@jabber.org
ICQ: 121532865


Profil

icon Re: Razdvajanje slojeva aplikacije u PHPu03.07.2006. u 09:50
Ziva diskusija, nema sta :)
blog.sun.com/srbija
Java User Group Karlsruhe
Studiranje u Nemačkoj

Officer, I saw the driver who hit me - his name was Johnny Walker.
03.07.2006. u 09:50 

boccio
Boris Krstović
Spoonlabs.com
nbgd

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

Sajt: blog.krstovic.info


Profil

icon Re: Razdvajanje slojeva aplikacije u PHPu03.07.2006. u 11:02
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]
03.07.2006. u 11:02 

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
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
03.07.2006. u 22:28 

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
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
15.07.2006. u 01:17 

liban0n
/in/my/office/

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

Sajt: www.dubrovnikapartments.n..


Profil

icon Re: Razdvajanje slojeva aplikacije u PHPu19.01.2007. u 10:04
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());
                    }
                }

---------------------------------
Knowledge is power
Dubrovnik Apartments
19.01.2007. u 10:04 

[es] :: Advanced PHP :: Razdvajanje slojeva aplikacije u PHPu
(TOP topic, by flylord)

[ Pregleda: 3033 | Odgovora: 10 ]

Postavi temu Odgovori

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