ugrás a tartalomhoz

Silex - MVC - Model?

kemmma · 2012. Aug. 21. (K), 12.42
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 $app = require __DIR__.'/app.php'; utasítást hajtják végre. (de ez minden meghívásnál újragyártja, vagy?)
 
1

Microframework

Práger Ádám · 2012. Aug. 21. (K), 14.37
Szia!

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.
2

sablonkezelő + adatbázis

kemmma · 2012. Aug. 21. (K), 15.09
Köszönöm a válaszodat!

É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. :)
3

Ez jó ötlet, úgy azért sokkal

Práger Ádám · 2012. Aug. 21. (K), 17.14
Ez jó ötlet, úgy azért sokkal könnyebb a tanulás, ha már pár dolgot ismersz belőle.

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 :)
4

Silex-el kapcsolatban nekem

Kubi · 2012. Aug. 23. (Cs), 13.50
Silex-el kapcsolatban nekem ezek az oldalak segítettek:

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)
5

"string-es forma"

kemmma · 2012. Aug. 24. (P), 06.56
Köszönöm, ezt a string-es formát még nem láttam, sokat egyszerűsít, kipróbáltam és csak akkor példányosítja, ha valóban kell, így ezzel sincs probléma! :)