Opensource MVC PHP framework

Kedves Fórumtagok!

Örömmel jelentem be, hogy szabadon elérhetővé tettem, LISA-nak becézett PHP-s keretrendszerem forrását. A keretrendszer megvalósítja a "model view controller"-ként elterjed paradigmát. A project elérhető itt, készítettem két rövid wiki bejegyzést, mely segíti a kezdeti nehéz lépéseket. A rendszert kisebb-nagyobb eltéréssel éles bevetésen is használom, tehát nem egy félkész dologról van szó, persze volt/van/lesz rajta mit fejleszteni.

Üdv.

Hozzászólások

Egy up-ot talán még megér azoknak akik esetleg csak hétvégén olvassák az oldalt, ezen felül javult és bővült a wiki és kijött egy alrelease is.

Érdekes ez a getrow-getall szokás. Elég lenne egy getall, úgyis a query határozza meg hány sor jön vissza. Egy array_shift-tel ugyanaz jön vissza a getallból mint a getrowból egy sor esetén. Minek az adatbázis absztrakció ha egyszer úgyis adatbázis specifikus a query?


$db = new dbhandler("user:password@localhost");
$result = array_shift($db->query("SELECT * FROM table WHERE name = 'Fred'"));
echo $result->userid;

$results = $db->query("SELECT * FROM table WHERE gender = 'male'");
foreach($results as $result){
  echo $result->userid;
}

Természetesen ez csak egy egyesített lekérdezés kezelő függvénnyel működne amit query-nek hívunk.

Mint a visszatérési értékből is látszik a getAll egy tömbbel tér vissza, míg a getOne egy objektummal, így van külömbség a két függvény között, és nem a fejlesztőnek kell a kivennie az első sort.


$db = new dbhandler("user:password@localhost");
$result = array_shift($db->query("SELECT * FROM table WHERE name = '". mysql_escape_string("Fred") . "'"));
echo $result->userid;

helyett mennyivel egyszerűbb (hogy a konkrét keretrendszer megoldásánál maradjunk)

echo QueryHandler::getOne("SELECT * FROM table WHERE name = :name", array("name" => "Fred"))->userid;

vagy

$results = $db->query("SELECT * FROM table WHERE gender = '" . mysql_real_escape_string(male) . "'");
foreach($results as $result){
echo $result->userid;
}

helyett pedig

$results = QueryHandler::getAll("SELECT * FROM table WHERE gender = :gender'", array("gender" => "gender"));
foreach($results as $result){
echo $result->userid;
}

persze ilyen egyszerű lekérdezésnél nem feltétlen tükröződik az egyzserűség.

Szerintem semennyivel. Ismerkedj meg Occam beretvájával.
A query escape-elése a preg_replace-es megoldással viszont tetszik. Én eddig a request-eket escape-eltem az alkalmazott adatbázistól függő módon, de valószínűleg ez a tutibb megoldás. Sőt, biztos.

echo array_shift($db->query("select szoveg from tabla where id=:id", array(id=>'14')))->szoveg;

Szia,

Megneztem. Alapvetoen az URL-mapping megoldasod tetszik, mert az a djangora emlekeztet (bar a kigyokat keruljuk, de elismerjuk oket). Ugyanakkor elegge letersz a megszokott modszerekrol. Az pl. kifejezetten tetszik, hogy nem a controller vadassza ki a getparametereket, hanem az igy jon.

Ma a webes keretrendszer-paradigmakban a mintak nagyjabol letisztultak, valljuk be, piciket a ruby on railsnek koszonhetoen, de PHP oldalon a legnagyobb hatast a latszat ellenere eleg lightweight Zend Framework (http://zend.framework.com) tette. Ebben egy controller tobb operaciot tud vegrehajtani, es az URL az a /controller/operation -nek felel meg.

Nem latom a rendszeredben az Auth frameworkot.

Nem latom azt, hogy minek van model frameworkod, ha az adatbazis frameworkodhoz nem kapcsolod egyaltalan. Altalaban ugyanis nem query-t akarsz vegrehajtani, hanem azokat a model elemeket szeretned megszerezni, amik megfelelnek bizonyos kriteriumoknak.

Szoval ez igy tok jo, de semmikeppen nem hasznalnam.

Tudnek ajanlani viszont par dolgot. Eloszor is mindenkepepn:

http://framework.zend.com (ezt lehet mar ismered persze;egyebkent szokas "darabokban" hasznalni, nehany moduljat csak)
http://symfony-project.org (ez a zend-et hasznalja, szep, nagy, okos)
http://rubyonrails.org (tudom, uncsi :)
http://java.sun.com/products/ejb/docs.html (Ez kokemeny anyag, de mondjuk hogy mit tud egy jo modelrendszer, azt az EJB2.1 specibe anno nagyon szepen leirtak... csak cseszettbonyolult volt hasznalni, igy maradt a lebutitott, de kenyelmes EJB3)
http://www.djangoproject.com/ - ez a kigyoke

Ja, a smarty-t felejtsd el. Nem passzintok be ide php forrast, hogy nehogy megoruljon a HUP, de alapvetoen a PHP maga egy template nyelv eredetileg, es kis trukkozessel - 11 sor - lehet irni rendes template engine-t, olyat, ami a Zend-alapu cuccokban is van. Ennyi: http://code.google.com/p/php-oembed/source/browse/trunk/LazyTemplateEng…

Egyszoval: az utnak az elejen jarsz, es kozel se biztos, hogy erdemes vegigjarni.

En a helyedben elkezdenek komolyan projektezni Zend-del es / vagy symfonyval ,mondjuk egy evet, utana visszaneznek, es megkerdeznem magamtol, hogy erdemes-e lightweight frameworkot csinalnom.

"az URL az a /controller/operation -nek felel meg"

ez elég nagy "butaság" mert nehéz többnyelvő oldalakat, ahol az url is többnyelvő készíteni.

"Nem latom azt, hogy minek van model frameworkod, ha az adatbazis frameworkodhoz nem kapcsolod egyaltalan. Altalaban ugyanis nem query-t akarsz vegrehajtani, hanem azokat a model elemeket szeretned megszerezni, amik megfelelnek bizonyos kriteriumoknak."

Igazából a modellek imlementálását teljesen a fejlesztőre bízza a rendszer, létezik pár abstract osztály, mely az entitások működését definiálja, de ezeket nem kötelező használni.

Ismerkedtem már pár keretrendszerrel a felsoroltak közül is, és számosat tanulmányoztam. Ami miatt mégis a saját fejlesztés mellett tette mle a voksom, az pont "Ugyanakkor elegge letersz a megszokott modszerekrol" és számomra sokkal kényelmesebb ez a megoldás.

Ami a smarty-t illeti, és ez teljesen szubjektív utálom a a php tageket folyton nyitni meg zárni és sokkal kényelmesebb a smarty.

Alapvetoen a controller/operation lehet akarmilyen nyelvu (peldaul angol), ugyis a parameter dont.

Rails eseteben pl. van ilyen: /articles/show/413-opensource-mvp-php-framework . Ebbol a /articles/show az lehet angol, es a maradek resz lokal nyelvu.
Teljes egeszeben lokalizalt url szerintem azert sem jo, mert aki esetleg nem ismeri a celnyelvet, az teljesen elteved az oldalon (pl. en a wincmd.ru oldalt azert tudom hasznalni, mert az url-jei kis kiveteltol eltekintve angol elemekbol allnak. Egy kukkot nem tudok oroszul). Meg teljes egeszeben ugysem lehet az url-t lokalizalni, hiszen pl. a domainnev fix (most tekintsunk el az ebay es hasonlo szornyetegektol).
--


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

"Nem latom azt, hogy minek van model frameworkod, ha az adatbazis frameworkodhoz nem kapcsolod egyaltalan. Altalaban ugyanis nem query-t akarsz vegrehajtani, hanem azokat a model elemeket szeretned megszerezni, amik megfelelnek bizonyos kriteriumoknak."
Megfogadva észrevételed implementáltam ilyen réteget. Használata itt, mondjuk nem újítottam nagyot, csak a keretrendszerben lévő eddigi elemekből építettem egy osztályt. Hozzáteszem, hogy nem vagyok híve az ilyen adatbázisból kiolvasom milyen oszlopok vannak megoldásoknak, bár tény, hogy egyszerűbb objektunok esetén nagyszerűen működik.

Probald megnezni, hogy a Rails hogyan hasznalja ezt a feature-t. Vannak azok a property-k amik az adatbazis oszlopaibol jonnek, de ugyanakkor akarmilyen property-t is irhatsz a sajat modelledben, olyant is, ami amugy absztrakt, tehat koze nincs az adatbazishoz, meg ugy nagyon semmihez sem.
Cserebe az objektumok kozti kapcsolati viszonlyatokat nagyon egyszeruen valositja meg (1:1, 1:N, N:N)
--


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Kösözönö mindenki építő hozzászólását.

Hint: ne hasznalj mailto: linket, nagyon sok bot kepes az ilyen alap obfuszkaciokat eliminalni. Kapcsold be a contact formot a profilodban, es oda linkelj. Ugyanugy e-mailben jon meg.
--


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.