Silex - MVC - Model?
Sziasztok! Most ismerkedem a Silex keretrendszerrel. Ám elég hamar megakadtam, a mintapéldáknál egy kicsivel bonyolultabb példát szeretnék létrehozni és nem világos, hogy a modell osztályokat miből kellene örököltetnem, a modell-ben hogy hivatkozok az applikációra, hogy érem azt el?
(google a barátom, így a silex getapplication –t és társait többször beírtam, de valahogy azokat nem tudtam elhelyezni)
Vannak helyek, ahol meg egyszerűen ahol kell az applikáció, ott a
■ (google a barátom, így a silex getapplication –t és társait többször beírtam, de valahogy azokat nem tudtam elhelyezni)
Vannak helyek, ahol meg egyszerűen ahol kell az applikáció, ott a
$app = require __DIR__.'/app.php';
utasítást hajtják végre. (de ez minden meghívásnál újragyártja, vagy?)
Microframework
A Silex egy microframework, kiváló kisebb feladatokra, vagy pl egy RESTful API megírására, te pedig egy komplett MVC frameworköt szeretnél használni a leírtak alapján.
A Silex a Symfony kistestvére, így azt ajánlanám, hogy a Symfony2 vel kezdj el ismerkedni. Elsőre valószínűleg nagy falat lesz, de ne ijedj meg, meg lehet tanulni, és utána már nem akarsz mással dolgozni :) Mivel a Doctrine2 őt sem ismered, azt nézd meg először.
Ha mindenképpen Silex, akkor itt egy cikk arról, hogyan lehet belerakni a Doctrine2 ORM-et: http://martinsikora.com/silex-doctrine2-orm, de ha engem kérdezel, akkor így pont a sebességét és egyszerűségét veszti el a Silex, ami egyébként a két legfontosabb előnye... akkor már a community és a már kész megoldások miatt sokkal jobbán jársz a Symfonyval.
Konkrétan a kérdéseidre válaszolva:
Silex nem MVC framework alapból.
Modell osztályok(továbbiakban Entity-k) a Doctrine2 ben nem származnak semmiből, EntityManager-nek nézz utána, ha érdekel.
A $app-ot nem kell elérned a Entityből, de még managerből sem.
Az anonymus függvényeknek így adhatsz át változót:
$app->get('/my-url', function() use ($app) {
return 'Hello';
});
Ha máshova is át kellene adnod a containert($app), az 99% ban rossz tervezés eredménye.
sablonkezelő + adatbázis
Én egy roppant egyszerű feladatot gondoltam megvalósítani, a komplettsége mindössze annyi, hogy egy külön osztályban legyen néhány elem (és ne névtelen függvényekben), és abból az osztályból elérjem az sablonkezelőt és az adatbázist. Ám, ha ezt a két komponenst nem érem el, akkor azok az osztályok szinte semmit sem tudnak csinálni.
A későbbi(?) cél természetesen a Symfony2 megismerése, csupán arra gondoltam, hogy talán könnyebb lenne első lépésnek a Silex. Így már mind a Twig-gel, mind a Doctrine-nel barátkozom... bízva abba, hogyha majd átváltok a Symfony2-re, akkor legalább lesz néhány ismert komponens. :)
Ez jó ötlet, úgy azért sokkal
Viszont az osztályokba szedés nem biztos hogy jó ötlet abban a formában... kicsit olyan mintha egy front controllert akarnál csinálni a már létező mellé/felé. Itt erre az index.php való. Persze kísérletezni szabad :)
Silex-el kapcsolatban nekem
http://php-and-symfony.matthiasnoback.nl/2012/01/silex-getting-your-project-structure-right/
http://sf.khepin.com/2011/04/a-first-silex-project/
Fenti linkek szépen leírják, hogyan hozd létre a silex projekt struktúrát, minden az index.php -n keresztül megy, nincs a web mappában több php fájl :)
Routing szabályoknál class metódusokat is megadhatsz:
$app->get('/blog/show/{id}', 'BlogController::show');
Úgy rémlik nem static ként hívja, hanem példányosítja a class-t, de constructorban nem ad át semmi paramétert. Tesztelni kell, de talán minden routingban használt class-t példányosít, attól függetlenül, hogy az van e éppen használva vagy sem. Ez elkerülhető, ha az url alapján nézzük, mit kell meg hívni, pl. /blog/* esetén BlogController -es routing szabályokat adjuk csak hozzá.
Ha a $app -ot el akarod érni, elég ha a fenti példánál maradva a class metódust így definiálod:
public function show(Silex\Application $app, $id)
"string-es forma"