4. előadás
Általánosan a modellről Table Data Gateway Pattern A modellosztályok áttekintése Zend_Db modellek nélkül Controllerek ismét Action-ök, és más metódusok M-V-C együttműködése
A modell mindig az üzleti logikát, az adathalmazokat jelenti egy alkalmazás esetén. Webes alkalmazásoknál ez leginkább a relációs adatbázisokat jelenti, de nem kizárólag.
Ne közvetlenül nyúljunk az adatbázishoz Legyen egy elérési réteg, amin keresztülmegy minden művelet Tábla átjáró, Sor átjáró programozói szemmel ez 2 db osztályt jelent, egyet a táblának, egyet a tábla egy rekordjának Zend_Db_* : Zend_Db_Table_Abstract, Zend_Db_Table_Row, Zend_Db_Table_Rowset
Ha a táblán egy lekérdezést hajtunk végre, rekordok halmazát kapjuk eredményül: Zend_Db_Table_Rowset típusú objektumot, amit bejárhatunk, hogy hozzáférjünk az egyes rekordokhoz mint Zend_Db_Table_Row objektum A Rowset-et nem sűrűn kell származtatni, mert minden, amire szükségünk lehet előre le van implementálva benne A táblákhoz és a rekordokhoz viszont mindig saját osztály írása (2 file a models mappában táblánként)
Elnevezési konvenciók (tábla, modell, sormodell) Protected attribútumok segítségével megadjuk az osztály fontosabb tulajdonságait: ◦ $_name ◦ $_primary ◦ $_rowClass ◦ $_rowsetClass ◦ $_referenceMap ◦ $_dependentTables ◦ $_schema ◦ …
Egyéni lekérdezések, a sorokra vonatkozó műveletek adhatók meg RowSetek esetén: current() metódus! Overriding jelentősége save() metódus (date_created, date_updated) toArray() – a rekordból név/érték párok alapján asszociatív tömböt készít
A két művelet nagyrészt megegyezik kódszinten, ezért egyetlen action-ben szoktuk megírni a duplikációk elkerülése végett (view-ban is egyezik)
resources.db.adapter = "pdo_mysql" resources.db.params.host = "localhost" resources.db.params.username = "webuser" resources.db.params.password = "XXXXXXX" resources.db.params.dbname = "test" resources.db.isDefaultTableAdapter = true
$config = new Zend_Config_Ini( APPLICATION_PATH.'/configs/application.ini', APPLICATION_ENV ); $db = $config->resources->db; $db = Zend_Db::factory($db->adapter, $db->params->toArray());
Használható a Zend_Db ún. adapteres módban is Ilyenkor nem írunk modellosztályokat Nem átlátható, nagy redundancia, ráadásul az MVC is sérül
Zend_Db_Select return: Provides a fluent interface SELECT name, salary FROM employee WHERE boss_ID = 12 AND salary< ORDER BY name ASC; $select = $db->select() ->from(‘employee’, array(‘name’, ‘salary’)) ->where(‘boss_ID = ?’, 12) ->where(‘salary < ?’, ) ->order(‘name’); $resRowSet = $db->fetchAll($select);
Létezik az összes SQL kulcsszóra (joinok különböző fajtái, group, having, stb…) metódus Előny: (szintaktikailag) adatbázisfüggetlen lekérdezés Automata idézőjelezés (biztonsági szempont) Persze nem kötelező élni a lehetőséggel, egyszerű query-ket is írhatunk Dinamikusság, ellentétben a beírt SQL-lel szemben
MySQL nem kezel kapcsolatokat A modell megírásával viszont képesek vagyunk rá Kapcsolatok számossága findDependentRowset() findParentRowset() findManyToManyRowset() $accountsTable = new Accounts(); $accountsRowset = $accountsTable->find(1234); $user1234 = $accountsRowset->current(); $bugsReportedByUser = $user1234->findDependentRowset('Bugs');
Pld.: Egy fórumtéma törlése esetén szeretnénk törölni az összes bejegyzést is az adott témában, de ezt nem akarjuk külön kiadni utasításba Sajnos csak egy szinten implementált A $_referenceMap tömb onDelete és onUpdate elemeiben jelennek meg
„Zend_Controller is the heart of Zend Framework's MVC system.” Osztályok, melyek a vezérlést végzik Kapcsolat az adatok, és azok megjelenítése közt IndexController és ErrorController URL-ek alapján dől el, melyik action fog futni Ezek az ún. action controllerek, van sok egyéb is
Utility methods _forward() _redirect() Action helperek Action-ök: Pld.: ForumController, listtopicAction() (view: views/scripts/forum/listtopic.phtml)
Paraméterek átadása GET-tel: /modifier/felhasznalo/mikor/ekkor $this->getRequest(); $_POST és $_GET együtt $request->getParam(’topicid’); $request->getParam(’modifier’); $request->getParam(’mikor’);
Tehát megírjuk a modellt, a controllerben elkérünk tőle egy adathalmazt, és azt feldolgozzuk Az action-ben pedig továbbadjuk a már megfelelően átdolgozott adathalmazt egy változóként a megjelenítésnek. (A view a következő előadás anyaga)
Adatbázis, adatbázisterv és modellek létrehozása Modellosztályok áttekintése Zend_Db adapter módban való használata Controllerekben való adatfeldolgozás