A Symfony keretrendszer telepítése és bemutatása
A keretrendszer, amivel már másfél éve dolgozom, gondoltam megér annyit, hogy írjak róla egy kis összefoglalót. Bár nincs túl jelentős fejlesztői előéletem, de kipróbáltam egy-két frameworköt. Ezenkívül a Symfony Project hónapról-hónapra növekszik, a közösség bővül, hetente újabb és újabb blogok foglalkoznak vele, egyre többen választják, vannak vele megelégedve, velem együtt.
Bár a Symfony adatbáziskezelő és kiszolgáló független, a példában Apache-ot és MySQL-t használok, mivel legtöbben ezt használják és a telepítése nulláról is gyorsan megvan az XAMPP programmal. Next-next-finish (opcionálisan service-ként is telepíthetjük), és máris van PHP5-ünk, Apache-unk és MySQL-ünk is, kezdődhet a móka (ha a böngészőbe beírt "localhost"-ra egy nagy XAMPP felirat jelenik meg, akkor tudhatjuk, minden jól ment idáig).
Ami fontos, a Symfony nem fut PHP4-en. A PHP5 az egyetlen teljesítendő kritérium azoknak, akik rendelkeznek már adatbázissal és webkiszolgálóval, mégis ajánlom a XAMPP telepítését ha követni szeretnék az alább leírtakat.
Az XAMMP telepítése után hozzunk elő egy Windows parancssort (futtatás -> "cmd") és telepítsük a Symfonyt a PEAR segítségével (1,908,095 bájtot fog letölteni):Ezután:Ha a megjelenő üzenet: symfony version 1.0.8, akkor minden rendben történt, a Symfony telepítés kész.Innentől minden Symfony utasítást ebből a könyvtárból fogok kiadni.
A webkiszolgáló konfigurációs állománya aEbből az első direktíva engedélyezi nekünk a létrehozandó
Fontos még megjegyezni, hogy aés vegyük ki a sor elejéről a # karaktert.
Mentsük el a konfigurációs fájlt, az XAMPP kezelőfelületen pedig indítsuk újra az Apache-ot.Ha beírjuk a böngészőbe a "localhost"-ot, és egy barna üdvözlő képernyő fogad minket, hogy "Congratulations! You have successfully created your symfony project.", akkor tudhatjuk, idáig sínen vagyunk.
Magyarázat a gyökérkönyvtárban létrejövő könyvtárakhoz:
Az
Az
Nyissuk meg a modulunkés van neki egy nyílvános tagfüggvénye:Mint látjuk, ez a művelet nem csinál mást, mint átirányít minket a Na, ez akkor most reprezentál nekünk egy műveletet, amit elméletileg meg is tekinthetünk. Örülünk neki, nézzük hát meg, írjuk be a böngészőbe:
Hoppá, nem látunk semmit, csak egy 500-as hibát, miszerint valami hiba történt a kiszolgáló oldalon. Hát ebből így nem tudunk megállapítani sokmindent, de legalább a látogatók nem láttak PHP hibaüzeneteket, meg összesett weboldalt (mint nagyjából mindent, ezt az oldalt is testre tudjuk szabni a konfigurációs állományokon keresztül).
Akkor most írjuk be a következőt:
Na, ha már itt vagyunk, nézzük végig ezt a hibaoldalt, mit is kapunk ezen a felületen. Kezdjük alulról most, ha már lesz tapasztalatunk, akkor az oldal tetején látható üzenetből is tudjuk mit kell tenni, de most nézzük végig. Az aláhúzott ...-okat érdemes kipróbálni, megtekinthetjük a globális változókat, a kérés, illetve a válasz konfigurációját és az egyéb Symfony beállításokat.
A listából a 15.-et nézzük meg. Látható hogy az
14.-ben az
A szűrők olyan függvények, amelyek minden kérés előtt lefutnak, ezáltal nem kell minden vezérlőben és minden sablonban megtennünk bizonyos dolgokat. Ilyen például, ha Google Analyticsszel mérni szeretnénk a weboldalunk látogatottságát. Egy szűrőben elhelyezzük azt a logikát, ami lekezeli nekünk a kivételeket (például a saját kattintgatásainkat nem akarjuk, hogy mérje), ezenkívül biztos hogy mindig ott lesz az Analytics JavaScriptje. A szűrők, mint oly sok más téma, sajnos nem fér bele ebbe a bemutatóba.
Utánuk a renderelés következik, ahol a vezérlőtől kapott paraméterekkel "megtelik" a sablon fájl, majd ez elhelyezésre kerül az alkalmazás sablonjában és tadamm, kerül visszaküldésre a böngészőbe.
Namost, hogy kijavítsuk a hibát, hozzunk létre a
Írjuk bele:Próbáljuk ki, hogy most működik-e:
Ezenkívül figyeljünk fel a jobb felső sarokban lévő Web Developer eszközre. Itt részleteket tekinthetünk meg a kiszolgálással kapcsolatban (nekem pl. 2819.1 KB, Time 242 ms).
Egészítsük ki a kódunkat:Ha megtekintjük az oldalt, a forrásban láthatjuk, lett egy űrlapunk, egy beviteli mezőnk és egy szövegdobozunk. A segédekről bővebben olvashattok (mint minden másról) a könyvben.
Nyissuk meg aEzzel megmondtuk a Symfonynak hogy hol van az adatbázisunk. Itt lehet saját adatbáziskezelőt is megadni, de nekünk jó a Symfonys MySQL, egyébként tudnánk így MSSQL-t, Oracle-t is használni. Ezen is látszik, a Symfony alapvetően úgy lett tervezve, hogy könnyedén testre lehessen szabni.
Nyissuk meg aEz a Propelnek, a beépített ORM eszköznek a beállítása. Ő fog gondoskodni arról, hogy nekünk csak definiálni kelljen az adatbázis modellt és ő mindent elintéz helyettünk. A fejlesztők dolgoznak egy alternatív ORM eszköz, a PHPDoctrine beépítésén.
Nyissuk meg aA példánkban egy darab táblát nézünk meg, de ez a leírás támogatja a külső kulcsot és a megszorításokat is.
A YAML-ben az egymás alatt lévő elemeket szóközzel kell behúzni, és azonos szinten lévő elemek előtt azonos számú szóköz van. Tabulátort nem tartalmazhat a YAML fájl! A
Akkor most jöjjön a generálás:Ez a művelet "all" néven a következő utasításokat végzi el, amiket egyenként is megadhattunk volna:A megváltozott modell állományok miatt törölnünk kell a gyorsítótárat:Ezzel a paranccsal minden létező gyorsítótárat kiürítünk. Specifikusan is meg lehetett volna mondani, hogy melyik alkalmazás, vagy azon belül melyik modul gyorstárát töröljük, de ez tutira töröl mindent.
A modell generálás ezzel kész. A
A
Ezeket az állományokat, funkciókat kiegészíthetjük saját lekérdezésekkel illetve saját függvényekkel, erre vannak a
Próbáljuk most ki az így elkészített modellünket. Készítsünk gyorsan egy modult, amely megvalósítja nekünk a CRUD (Create, Read, Update, Delete) funkciókat, hogy tudjuk kezelni a táblában a sorainkat.Ezennel készen is van. Próbáljuk ki:
Adjunk hozzá a táblánkhoz egy pár sort, használva a "save and add" funkciót:
A "list" gombbal listázzuk őket ki. A listában az "ID" gombra kattintva tudjuk az egyes elemeket szerkeszteni.Ezáltal bárhol, ahol van egy Töröljük ki a gyorsárat, hogy a következő kérésnél a keretrendszer a natív PHP kódot újragenerálja nekünk.Hozzuk létre a
Legyen a tartalma:Az admin generátor végigmegy a kilistázott elemeken és meghívja azt a sablont, amit hozzárendeltünk a "field" mezőben megadottakhoz. A sablonban paraméterként megkapja az aktuális objektumot, így annak tagfüggvényét meghívjuk, és azt íratjuk ki.
Próbáljuk ki, most hogy néz ki a listánk:
Akit jobban érdekel az admin generátor, annak érdemes megnéznie a "Hogy csináljunk blogot fél óra alatt" videót, ami bár elég régi, – még a 0.63-as verzióval készült – jól demonstrálja az admin generátor erejét, testreszabhatóságát. A teljes funkcionalitás puskája itt: http://www.symfony-project.com/blog//2006/04/25/admin-generator-cheat-sheet .
Tegyük fel, hogy szeretnénk egy oldalt, amin a felhasználóinkat lehet keresni. Tegyük fel, úgy döntünk, hogy egy kereső mező és egy gomb segítségével AJAX segítségével lekérjük az adott
Vegyünk fel az adatbázisba a generátoros modulunkkal még egy pár embert, hogy tudjunk tesztelni. Hozzunk létre egy műveletet a testmodulban, ami paraméterként kap egy karakterláncot, végrehajt egy adatbázis lekérdezést aKészítsünk ehhez egy sablont (Most, hogy megvan, ezt jelenítsük meg egy másik műveletben, a Majd a sablon:Teszteljük hát itt:
Ezekről teljes leírás található a könyvben, vagy a Symfony Project wikiben.
Remélem ez a bemutató sokatok érdeklődését felkeltette, és valamennyire képet ad a Symfonyról, és arról, hogy an induljatok el a felfedezésére.
Fabien Potencier, a project egyik vezetője mondta – mikor bejelentették, hogy a keretrendszerről megjelent könyvet online publikálják, ingyenesen letölthetővé teszik teljes egészében – hogy "That's how we see open source.". Ebből kiindulva írtam ma ezt a cikket, ha tetszett és értelmét látjátok, írhatok még többet is, részletesebbet is, és talán, ha egyszer elegen leszünk, beindíthatjuk közösen a symfony.hu weboldalt, hogy mi is hozzátegyünk valamit ehhez az egyre gyarapodó keretrendszerhez.
■ Áttekintés
Mit is tud?
- Object-Relational Mapping (Propel)
- MVC minta szerinti felépítés
- Bővítmények
- Egyszerű sablon és segéd rendszer
- Gyorsítótárazás
- Szép URL-ek
- Többnyelvűség és I18N támogatás
- Egyszerű konfigurálási lehetőség YAML-el
- Adminisztrációs felület kódgenerálása és közös feladatok automatizálása
- stb.
Támogatás
- Nagy taglétszámú fejlesztői közösség, fórum
- Wiki
- Nagyszerű könyv, amit a fejlesztők írtak és ingyenesen letölthető
- Kódtöredékek, bővítmények, hogyanok tömkelege
- Admin generátor demonstráló film
- Easy Ajax demonstráló film
- 24 leckés fejlesztői tutorial
Kik választották
- A Yahoo! már választotta, több projectjéhez is (Yahoo! Bookmarks [napi 40 millió kattintás])
- Del.icio.us, a népszerű szolgáltatás következő verziója
Hogy miért választotta a Yahoo! a Symfonyt?
- Great documentation – In-Depth Online Book + API Documentation + Wiki
- Active development – Consistent improvements in design: flexibility + speed
- Active community – Large community with plenty of free support
- Flexibility – Overall design + configuration system + plugins
- Use of best-of-breed components rather than reinventing the wheel
Magyar fejlesztők
- Symfony-hu Google Group
- Magyar fejlesztői portál tervben van...
Telepítés
A telepítési útmutató néhol elég részletes, elnézést annak akinek nem mond újat, de az alább leírtak kezdők számára is végigvihetőek.Előkövetelmények
A következő példa szűz Windows XP Service Pack 2 rendszerre mutatja be a telepítést (garanciát vállalok: végigcsináltam), mivel legtöbbünknek ez áll rendelkezésre otthon. Rengeteg telepítési útmutató keletkezett már eddig a legtöbbet használt operációs rendszerekre, Apache-ra és IIS-re is.Bár a Symfony adatbáziskezelő és kiszolgáló független, a példában Apache-ot és MySQL-t használok, mivel legtöbben ezt használják és a telepítése nulláról is gyorsan megvan az XAMPP programmal. Next-next-finish (opcionálisan service-ként is telepíthetjük), és máris van PHP5-ünk, Apache-unk és MySQL-ünk is, kezdődhet a móka (ha a böngészőbe beírt "localhost"-ra egy nagy XAMPP felirat jelenik meg, akkor tudhatjuk, minden jól ment idáig).
Ami fontos, a Symfony nem fut PHP4-en. A PHP5 az egyetlen teljesítendő kritérium azoknak, akik rendelkeznek már adatbázissal és webkiszolgálóval, mégis ajánlom a XAMPP telepítését ha követni szeretnék az alább leírtakat.
Telepítés
Tegyük be a Windows környezeti változók közé a PATH-ba aC:\xampp\php
-t, majd indítsuk újra a számítógépet, hogy érvényesüljön, és innentől a php.exe
-t és a PEAR-t mindenhonnan használni tudjuk. Akik lusták azoknak a set path=C:\xampp\php
parancs is megfelel, de ők is rakják be a Windowson keresztül a PATH-ba, hogy ne kelljen ezt mindig beírni.Az XAMMP telepítése után hozzunk elő egy Windows parancssort (futtatás -> "cmd") és telepítsük a Symfonyt a PEAR segítségével (1,908,095 bájtot fog letölteni):
pear channel-discover pear.symfony-project.com //hozzáadjuk a listához a forrást
pear install symfony/symfony
symfony -V
Beállítás
Project könyvtár létrehozása
Ez a legnehezebb része ;) Lépjünk be kívánt könyvtárba (nekemC:\www
lesz), ahol projectjeinket akarjuk tárolni, és:
mkdir testproject
A webkiszolgáló beállítása
A webszerverünket kicsit konfigurálnunk kell, mert a Symfony könyvtárszerkezete nem a gyökérbe teszi az elülső vezérlőnket (amin keresztül az összes kérés kiszolgálásra kerül). Ez egyrészt lehetőséget ad nekünk arra, hogy a kódunkat ne egy nyílvános felületre, hanem a kiszolgáló egy olyan részére tegyük, amihez nincsen külső hozzáférés – védve ezáltal magunkat a törésektől –, mindemellett a Symfony mag nekünk a PEAR könyvtárba került, így bizonyos állományokat csak egy álnéven keresztül tudunk elérni. Ha projectünket kompaktálni akarjuk, akkor asymfony freeze
parancs az összes Symfony állományt bemásolja nekünk a project könyvtárunkba.A webkiszolgáló konfigurációs állománya a
C:\xampp\apache\conf\httpd.conf
, ennek végére szúrjuk be a következő bejegyzést:
<Directory "C:\php5\pear\data\symfony\web\sf">
Allow from All
</Directory>
<VirtualHost *:80>
DocumentRoot "C:\www\testproject\web"
DirectoryIndex index.php
Alias /sf "C:\php5\pear\data\symfony\web\sf"
<Directory "C:\www\testproject\web">
AllowOverride All
Order allow,deny
Allow from All
</Directory>
</VirtualHost>
Alias
könyvtár hozzáférését, a következőben pedig beállítjuk a szerver könyvtárát – innentől ez lesz a project könyvtárunk –, az Alias
t és a hozzáférést.Fontos még megjegyezni, hogy a
mod_rewrite
modul bekapcsolása ajánlott, ha szeretnénk szép URL-eket. A httpd.conf
ban keressük meg a következőt:
#LoadModule rewrite_module modules/mod_rewrite.so
Mentsük el a konfigurációs fájlt, az XAMPP kezelőfelületen pedig indítsuk újra az Apache-ot.
Példaalkalmazás
Project létrehozása
Lépjünk be a project könyvtárunkba (C:\www\testproject
) és:
symfony init-project testproject
Magyarázat a gyökérkönyvtárban létrejövő könyvtárakhoz:
app/
– itt lesznek az alkalmazásaink, amik egymástól elkülönített programok, közös konfigurációval és objektum osztályokkal
batch/
– ide lehet tenni a kötegelt utasítássorozatokat, mint például az adatbázis feltöltése példa adatokkal stb.
cache/
– ehhez a könyvtárhoz nem fogunk nyúlni, ide a Symfony generálja a gyorstár állományait, amiket asymfony cc
paranccsal tudunk teljesen kiüríteni
config/
– minden alkalmazásra vonatkozó konfigurációs állományok
data/
– minden adat jellegű közös információ
doc/
– esetleges dokumentációk helye (hehe)
lib/
– közös osztálykönyvtárak
log/
– a Symfony ide fog nekünk naplózni
plugins/
– Symfony bővítmények, amiket különálló egységként lehet telepíteni, és a funkcionalitást eléri minden alkalmazás, ahol az engedélyezve van
test/
– teszt állományok
web/
– ez a könyvtár tartalmaz minden közös erőforrást, amit a webszervernek tudnia kell külön is kiszolgálni – itt van az elülső vezérlőnk (index.php
), amin keresztül a Symfony fut, feldolgozásra kerül a kérés, lefutnak a különböző a különböző rétegek és végül, ami létrehozza a választ – ezenkívül ide kell rakni a CSS, JavaScript, kép fájlokat és feltöltött állományokat. Van még egyweblabor_dev.php
is, az elülső vezérlőnk fejlesztői oldala, ami bővebb információkkal szolgál nekünk, fejlesztőknek. Lesz róla még szó.
Alkalmazás létrehozása
Most, hogy megvan a projectünk, hozzunk létre egy alkalmazást:
symfony init-app weblabor
apps/weblabor/
könyvtáron belül létrejövő könyvtárak:config/
– alkalmazás specifikus konfigurációs állományok
i18n/
– lokalizáció és globalizációs információk
lib/
– alkalmazás specifikus osztálykönyvtárak
modules/
– modulok
templates/
– sablonok
Modul létrehozása
Na, most, hogy már van projectünk, van alkalmazásunk, csináljunk egy modult:
symfony init-module weblabor testmodul
apps/weblabor/modules/testmodul
könyvtár tartalma:actions/
– a vezérlő réteg, amely elvégzi nekünk a háttérmunkát, előállítja az adatokat (összehalássza az ORM-mel az adatbázisból), ezeket hívják actions-nek, innentől műveletnek hívom – ha bejön egy kérés, a keretrendszer érzékeli, hogy melyik modul és annak melyik művelete lett meghívva, majd átadja a vezérlést azactions/actions.class.php
állományban található osztálynak, amelynek az a függvénye kerül meghívásra, ami a vezérlőt implementálja.
config/
– modul specifikus konfiguráció
lib/
– modul specifikus osztálykönyvtárak
templates/
– az egyes műveletekhez rendelt sablonok
Nyissuk meg a modulunk
actions.class.php
állományát. Itt van egy osztály:class testmodulActions extends sfActions
public function executeIndex()
default
modul module
műveletére ($this->forward('default', 'module');
). A tagfüggvény elnevezése mindig az executeNév()
mintát követi, ahol a Név a művelet neve.Ismerkedés a működéssel
Csináljunk egy új tagfüggvényt:
public function executeTest()
{
//adatbázisból adatokat töltünk
//minden mást csinálunk
//stb.
$this->test_data = array('egy', 'ketto', 'harom');
}
http://localhost/testmodul/test
.Hoppá, nem látunk semmit, csak egy 500-as hibát, miszerint valami hiba történt a kiszolgáló oldalon. Hát ebből így nem tudunk megállapítani sokmindent, de legalább a látogatók nem láttak PHP hibaüzeneteket, meg összesett weboldalt (mint nagyjából mindent, ezt az oldalt is testre tudjuk szabni a konfigurációs állományokon keresztül).
Akkor most írjuk be a következőt:
http://localhost/weblabor_dev.php/testmodul/test
. Most meghívjuk elülső vezérlőként a weblabor_dev.php
-t az index.php
helyett. Láthatunk egy szép kis hibaoldalt egy üzenettel: "The template "/testSuccess.php
" does not exist in:". Jajj, tényleg, elfeledkeztünk arról, hogy a műveletnek nem csak logikája van, hanem kell hozzá azért megjelenítés is. Na, ha már itt vagyunk, nézzük végig ezt a hibaoldalt, mit is kapunk ezen a felületen. Kezdjük alulról most, ha már lesz tapasztalatunk, akkor az oldal tetején látható üzenetből is tudjuk mit kell tenni, de most nézzük végig. Az aláhúzott ...-okat érdemes kipróbálni, megtekinthetjük a globális változókat, a kérés, illetve a válasz konfigurációját és az egyéb Symfony beállításokat.
A listából a 15.-et nézzük meg. Látható hogy az
sfFrontWebController
dispatch()
függvénye kerül meghívásra a weblabor_dev.php
fáljban. Ez idáig nem meglepetés, ha megnéztük mit tartalmaz a fájl, de innentől nyomonkövethetjük, hogy milyen állományok milyen osztályainak milyen függvényei kerülnek meghívásra, és pontosan hol.14.-ben az
sfController
osztály – miután a keretrendszer megállapította a kérésből, hogy mit is szeretnénk – továbbít minket arra a modul/vezérlő párosra, amit tényleg szerettünk volna, majd szűrők jönnek. A szűrők olyan függvények, amelyek minden kérés előtt lefutnak, ezáltal nem kell minden vezérlőben és minden sablonban megtennünk bizonyos dolgokat. Ilyen például, ha Google Analyticsszel mérni szeretnénk a weboldalunk látogatottságát. Egy szűrőben elhelyezzük azt a logikát, ami lekezeli nekünk a kivételeket (például a saját kattintgatásainkat nem akarjuk, hogy mérje), ezenkívül biztos hogy mindig ott lesz az Analytics JavaScriptje. A szűrők, mint oly sok más téma, sajnos nem fér bele ebbe a bemutatóba.
Utánuk a renderelés következik, ahol a vezérlőtől kapott paraméterekkel "megtelik" a sablon fájl, majd ez elhelyezésre kerül az alkalmazás sablonjában és tadamm, kerül visszaküldésre a böngészőbe.
Namost, hogy kijavítsuk a hibát, hozzunk létre a
apps/weblabor/modules/testmodul/templates
könyvtárban egy testSuccess.php
állományt. Ennek a formája mindig névSuccess.php
.Írjuk bele:
<h1>Hello-bello</h1>
<ul>
<?php foreach ($test_data as $element): ?>
<li><?php echo $element; ?></li>
<?php endforeach; ?>
</ul>
http://localhost/weblabor_dev.php/testmodul/test
. Mint látszik, amit a vezérlő rétegben az akció logikájában megadtunk a művelet osztályának attributúmaként ($this->test_data = ...
), azt most itt a sablonban közvetlenül elérjük ($test_data
).Ezenkívül figyeljünk fel a jobb felső sarokban lévő Web Developer eszközre. Itt részleteket tekinthetünk meg a kiszolgálással kapcsolatban (nekem pl. 2819.1 KB, Time 242 ms).
Segédek
A segédek a sablonozást segítik. Olyan előre legyártott HTML elemekről van itt szó, amiket nem akarunk mindannyiszor begépelni, hanem csak paraméterezni egy függvényt.Egészítsük ki a kódunkat:
<h1>Hello-bello</h1>
<ul>
<?php foreach ($test_data as $element): ?>
<li><?php echo $element; ?></li>
<?php endforeach; ?>
</ul>
<?php echo form_tag('test'); ?>
<?php echo input_tag('test_txt'); ?><br/>
<?php echo textarea_tag('test_txt2'); ?>
</form>
Egy kis adatbázis és egy kis admin generátor
Hívjuk meg ahttp://localhost/phpmyadmin/
címet, ahol megjelenik nekünk a phpMyAdmin. Csináljunk egy adatbázist "testproject" néven. Zárjuk be, többet erre nem lesz szükség.Nyissuk meg a
config/database.yml
állományt és kommentezzük ki, ami ott van, majd a "dbname" helyére írjunk "testproject"-et:
all:
propel:
class: sfPropelDatabase
param:
dsn: mysql://root:@localhost/testproject
Nyissuk meg a
config/propel.ini
állományt és a megfelelő sort helyettesítsük a következővel:
propel.database.url = mysql://root:@localhost/testproject
Nyissuk meg a
config/schema.yml
állományt és definiáljunk a YAML leíró nyelv segítségével egy adatbázis táblát:
propel:
ask_user:
_attributes: {phpName: User, idMethod: native}
id: {type: integer, required: true, primaryKey: true, autoIncrement: true}
nickname: {type: varchar(50), required: true, index: true}
first_name: varchar(100)
last_name: varchar(100)
created_at: ~
A YAML-ben az egymás alatt lévő elemeket szóközzel kell behúzni, és azonos szinten lévő elemek előtt azonos számú szóköz van. Tabulátort nem tartalmazhat a YAML fájl! A
created_at
mezőt a rendszer automatikusan felismeri és időbélyeg típusúra állítja.Akkor most jöjjön a generálás:
symfony propel-build-all
symfony propel-build-model //a sémánk alapján a model fájlok generálása
symfony propel-build-sql //a séma alapján az SQL relációk létrehozása
symfony propel-insert-sql //a legenerált SQL scriptet lefuttatja az adatbázisunkon
symfony cc
A modell generálás ezzel kész. A
lib/
könyvtárban lettek elhelyezve a generált állományaink, ezeket érdemes böngészni egy kicsit ha kezdők vagyunk Propelben. A lib/model/om
-ben vannak a legenerált fájlok, tartalmazzák az SQL leképezést, és könnyen használható felületet biztosítanak a modell elemek módosítására, lekérdezésére, mint a BaseUser.php
, ami megfelelteti nekünk a SQL táblát PHP változóknak és állandóknak, megvalósítja a beillesztést, a törlést és a módosítást. Ezek a fügvények a modell objektumunk tagfüggvényei lesznek.A
BaseUserPeer.php
-ban statikus függvények vannak, amiket bárhonnan meghívhatunk, és egy objektum gyűjteményt vagy sima értéket adnak vissza.Ezeket az állományokat, funkciókat kiegészíthetjük saját lekérdezésekkel illetve saját függvényekkel, erre vannak a
lib/model/
-ben a User.php
és a UserPeer.php
fájlok. Ha meg akarjuk változtatni az adatbázis sémánkat és újra legeneráltatjuk, csak a Base fájlok lesznek felülírva, az általunk kezelt kiegészítő állományok nem.Próbáljuk most ki az így elkészített modellünket. Készítsünk gyorsan egy modult, amely megvalósítja nekünk a CRUD (Create, Read, Update, Delete) funkciókat, hogy tudjuk kezelni a táblában a sorainkat.
symfony propel-init-admin weblabor user User
http://localhost/user
. Láthatjuk, hogy van egy "user list" feliratunk és egy "Create" gombunk. Használjuk hát a create funkciót, a megjelenő űrlapon látható, hogy amit a sémában "required:true"-nak adtunk meg az, ki van emelve, az id
az nem látszik, mivel az elsődleges kulcs és ráadásul auto_increment
, a created at
pedig automatikusan egy dátum-idő mező a mellette lévő dátum kiválasztó eszközzel.Adjunk hozzá a táblánkhoz egy pár sort, használva a "save and add" funkciót:
- sanyi – Sándor – Nagy – 2007-10-21 16:08
- geza – Géza – Kiss – 2007-10-21 16:09
- arpi – Árpád – Fogarasi – 2007-10-21 16:10
A "list" gombbal listázzuk őket ki. A listában az "ID" gombra kattintva tudjuk az egyes elemeket szerkeszteni.
Kis modell változtatás és admin generátor beállítás
Tegyük fel, akarunk egy olyan nézetet, ahol az egyén teljes neve szerepel. Ugye ez egy származtatott tulajdonság, az objektum tulajdonsága, ezért alib/model/User.php
-ban a helye. Nyissuk hát meg az állományt és írjuk bele a következőket:
class User extends BaseUser
{
public function getFullName()
{
return $this->getFirstName() . ' ' . $this->getLastName();
}
}
User
objektumom, ott annak lesz egy getFullName()
tagfüggvénye. Varázsoljuk most ezt bele az admin listánkba. Nyissuk meg a apps/weblabor/modules/user/config/generator.yml
-t, és írjuk bele a következőket:
generator:
class: sfPropelAdminGenerator
param:
model_class: User
theme: default
list:
display: [_fullname, created_at]
max_per_page: 2
filters: [nickname, created_at]
symfony cc
apps/weblabor/modules/user/templates/_fullname.php
állományt, ezeket hívják részlet sablonoknak, amelyek a modulhoz tartoznak, de bárhova beilleszthetők (include_partion('modul/művelet')
függvény, de van még ezenkívül összetevő modul is, ezekről most nem ejtünk szót).Legyen a tartalma:
<?php echo $user->getFullName(); ?>
Próbáljuk ki, most hogy néz ki a listánk:
http://localhost/user
. Láthajtuk hogy megoldottuk a feladatot és ráadásul van saját lapozó fülünk is, mivel beállítottuk az admin generátornak hogy egy oldalra két elemet rakjon. Ezenkívül "filter"-t is konfiguráltunk, ez jobb oldalt látszik, próbáljuk is ki. Az admin generátor nem egy csoda, nem egy szuper szoftver, viszont rengeteg olyan dolgot tud ami egy weboldal adminisztrációs felületének tervezésekor előjön. A készítők koncepciója, hogy nem kell mindig újra feltalálni a kereket vagy a spanyol viaszt, amit valaki jól megírt, azt használjuk. Emellett szép struktúrált a kód, bármikor hozzáfejleszthetünk az admin generátor belső logikájához, és, ami megvan az jól dokumentált.Akit jobban érdekel az admin generátor, annak érdemes megnéznie a "Hogy csináljunk blogot fél óra alatt" videót, ami bár elég régi, – még a 0.63-as verzióval készült – jól demonstrálja az admin generátor erejét, testreszabhatóságát. A teljes funkcionalitás puskája itt: http://www.symfony-project.com/blog//2006/04/25/admin-generator-cheat-sheet .
Modell manipulálás generátor nélkül + AJAX példa
Lássuk, hogy működik belülről a Propel és a Symfony, amit elrejt előlünk a generátor. Kicsit olyan érzésem van most, mint amiket Visual Studio .NET előadásokon szoktak mondani, "lehet ezt kódból is" (nyilván a példa súlya nem egyenértékű).Tegyük fel, hogy szeretnénk egy oldalt, amin a felhasználóinkat lehet keresni. Tegyük fel, úgy döntünk, hogy egy kereső mező és egy gomb segítségével AJAX segítségével lekérjük az adott
FirstName
-mel rendelkező felhasználókat, és ezt belerakjuk egy divbe ágyazott táblázatba.Vegyünk fel az adatbázisba a generátoros modulunkkal még egy pár embert, hogy tudjunk tesztelni. Hozzunk létre egy műveletet a testmodulban, ami paraméterként kap egy karakterláncot, végrehajt egy adatbázis lekérdezést a
FirstName
-re, és eltárol egy User objektum gyűjteményt.
public function executeGetusersbyfirstname()
{
//paraméter lekérdezése
$first_name = $this->getRequestParameter('first_name');
//új kritéria objektum
$c = new Criteria();
//hozzáadjuk a 'first_name' = name feltételt
$c->add(UserPeer::FIRST_NAME, $first_name);
//lekérjük a kritériumnak megfelelő objektumokat
$users = UserPeer::doSelect($c);
//átrakjuk a sablon hatáskörébe
$this->users = $users;
}
getusersbyfirstnameSuccess.php
):
<table>
<?php foreach ($users as $user): ?>
<tr>
<td>
<?php echo $user->getFirstName(); ?>
</td>
<td>
<?php echo $user->getLastName(); ?>
</td>
<td>
<?php echo $user->getCreatedAt(); ?>
</td>
</tr>
<?php endforeach; ?>
</table>
testmodul
searchuser
műveletében, ehhez vezérlő rétegbeli utasításokra nem lesz szükség, mivel csak kirakjuk a gombot és a beviteli mezőt:
public function executeSearchuser()
{
}
<?php use_helper('Javascript'); ?>
<div id="eredmeny" style="height:500px;"></div>
<?php echo input_tag('first_name'); ?>
<?php echo link_to_remote('Keress', array(
'update' => 'eredmeny',
'url' => 'testmodul/getusersbyfirstname',
'with' => "'first_name = ' + $('first_name') . value",
'loading' => "Element.show('indicator')",
'complete' => "Element.hide('indicator')",
)); ?>
<p id="indicator" style="display:none">
<img src="http://www.symfony-project.com/demo/images/indicator.gif" alt="Indicator" />
Kereses folyamatban...
</p>
http://localhost/testmodul/searchuser
.Végszó:
Láthattuk hát dióhéjban, mit tud a Symfony. A rendszer most ünnepli második születésnapját, és ketten kezdték el a fejlesztését. Rengeteg mindent tud még, amiről itt nem esett bővebben szó, többek között, bármilyen sorrend nélkül:- URL rewrite konfiguráció
- Saját osztálykönyvtár beillesztése
- Összetevő modulok
- Szűrők
- Gyorsítótár
- I18N
- Alkalmazás és modul szintű saját konfigurációs adatok megadása
- Saját segéd írása
- Beépített, konfigurálható jogosultság kezelés
- Konfigurálható és bővíthető hitelesítő rendszer
- Bővítmények, melyekkel gyorsan összerakható egy teljes portál: sfSimpleCMS, sfSimpleBlog, sfGuard, sfMediaLibrary, sfSimpleForum; ezeket gyorsan fel lehet telepíteni, konfigurálni, és folyamatosan fejlesztik őket
Ezekről teljes leírás található a könyvben, vagy a Symfony Project wikiben.
Remélem ez a bemutató sokatok érdeklődését felkeltette, és valamennyire képet ad a Symfonyról, és arról, hogy an induljatok el a felfedezésére.
Fabien Potencier, a project egyik vezetője mondta – mikor bejelentették, hogy a keretrendszerről megjelent könyvet online publikálják, ingyenesen letölthetővé teszik teljes egészében – hogy "That's how we see open source.". Ebből kiindulva írtam ma ezt a cikket, ha tetszett és értelmét látjátok, írhatok még többet is, részletesebbet is, és talán, ha egyszer elegen leszünk, beindíthatjuk közösen a symfony.hu weboldalt, hogy mi is hozzátegyünk valamit ehhez az egyre gyarapodó keretrendszerhez.
:)
T.
köszönet
Ha valakit érdekel a project amit csináltam a cikk írása közben, akkor belinkelem.
Linkeld be
hiánypótló
üdv,
w.
szuper kedvcsináló
Egyébként gratula, érthető, világos, és azért merült fel bennem a kérdés, mert éppen a kipróbálásnál tartok... :)
a projeck forrása
csak a project fájlok : http://symfony.hu/docs/testproject.zip
és annak akinek nem sikerült felrakni a symfony-t, itt van a fagyasztott verzió, amihez már csak webkiszolgáló kell és működik is ( 2,5 Mbyte ) : http://symfony.hu/docs/testproject-symfony108.zip
Pal_ur: az utolsó részt úgy állítottam össze, hogy kicsit bonyolultabb legyen és ha az előzőeket végigcsináltad és megértetted, akkor mennie kell.
Tényleg ha valaki végigcsinálta, kérem jelezze, hogy minden rendben ment-e.
sorrend
Nálam csak akkor jött be a "Symfony Project Created" oldal, ha már a
Üdv Karesz
propel
Fantasztikus a doksi, szép a forrás, közösség is aktív, és folyamatosan fejlődik.
Az egyetlen komoly gyengesége szerintem a Propel, ami nyílván kényszermegoldás volt a kezdeteknél, mert nem volt más, de ez is meg fog változni, a Doctrine nagyon beindult (Summer of Code), az 1.1-ben pedig már pluginba kerül a Propel, így könnyen cserélhető lesz.
Annyira nem rossz a Propel sem, kisebb projektekhez bőven elég, de mi egy nagy rendszert fejlesztünk nagyon komplex adatbázissal, így hamar kijöttek a gyengeségei.
Doctrine
Üdv,
Felhő
egyre jobb
Az utobbi fel evben sokat allasinterjuztam es a legtobb cegnel (akihez szivesen mentem volna dolgozni) mar symfony-t hasznalnak (kiveve azok, akik evek ota sajat nagy rendszeruk fejlesztik).
A propel-t tartom a legnagyobb gyengesegenek. Nem a sebessege, hanem a hasznalhatosaga es a dokumentacioja tekinteteben. A dokumentacio egesz jo, csak mire megtalalom amit keresek, arra oreg este lesz.
Remelem a doctrine feloldja a propel okozta frusztraciot.
Egy érdekes adat
Azaz az egyszerű "Hello bello!" oldalból másodpercenként ~4-et tud előállítani. Természetesen ez függ a gépedtől is, de nem hiszem, hogy egy PII300 gépen futott volna a dolog.
igen
Így már szebb az eredmény
Egyébként szerintem a kiszolgálható oldalak száma többet mond, vagy jobban megjegyezhető: ~80-90ms ~13-11 p/s.
na így ?
Kösz a tájékoztatást!
pluginok néha hibásak
Egy hibájára azonban szeretnék kitérni, illetve ez nem is hiba, hanem talán átgondolatlanság és időhiány a fejlesztők részéről - nincs idejük ellenőrizni mindent és lehetne még csiszolni a pluginok csatolásán. A hivatalos oldalon lévő pluginok gyakran okozhatnak fejfájást! A cikkben is említett "sfSimpleBlog" például nekem eléggé nagy galibát okozott, de említhetnék több plugint is amelyeket eddig teszteltem. Szóval ezekkel óvatosan, mert lehet velük baj, főleg az adatbázis részben. A telepítési útmutatókat mindig érdemes átolvasni, bár néha ez sem segít - persze ez mindenre igaz nem csak a Symfonyra.
nekem nem megy
Ezt kapom amikor próbálkozom:
senki?
Köszi,
T.
view rész
Hogy miért bajom ez?
- hogyan tudok normálisan js-t generálni?
- a megjelenített lap mit tud saját magáról (milyen hotkeyek vannak - vannak-e a hotkeyekben ütközések, a tag-ek id -ben vannak-e ütközések, melyikhez nem adtam meg id -t vagy melyikhez nem adtam js függvényt) ha developer módban fut akkor milyen ellenőrzéseket tud végrehajtani saját magával kapcsolatban (generálási idő)
- debug módban a sorvégekre tegyen vagy ne tegyen újsor jelet (hogy a html olvasható legyen)
- most több nem jut eszembe :)
Ennek ellenére használom a ZF -t és kezd kialakulni benne egy olyan rész ami ebben segít nekem (én csináltam) illetve ott kb. 2 hete jelent meg a Zend_Layout ami talán megoldást kínál erre is (nem próbáltam még).
Nincs ezzel baj
A Zend_Layout a kétlépéses nézet mintát valósítja meg, egyszerűen beilleszti a generált kimenetet egy „külső” sablonba. Emellett van hozzá pár segéd is, ami megkönnyíti pl. a
<head>
tartalmának módosítását a műveleteken és a műveletekhez tartozó nézeteken belülről (igen, tehát a nézet-specifikus dolgok különállóak).Mellesleg egy-egy bővítménnyel, művelet- és nézetsegéddel én már régóta használom így a ZF-et, tehát a Zend_Layout megjelentéig sem okozott a dolog túl nagy problémát.
1.1
http://www.aide-de-camp.org/talk/7/international-php-conference-2007
nálam vmiért nem akar menni...
Én is szeretném kiprobálni ezt a symfony-t, de nálam vmiért nem megy a
telepítés.
Amikor kiadom a:
pear channel-discover pear.symfony-project.com
parancsot, akkor a következö üzenetet adja:
Registry directory is not writeable by the current user
Namost ez egy windos xp sp2 ahol nincsenek felhasználók, csak én mint root.
Szóval nem tudok ezzel a helyzettel mit kezdeni, ha tud valaki kérem segítsen.
Köszi
Kezdetnek
httpd.conf
Mit kell hozzáírni a httpd.conf-ba illesztendő részhez, ha én nem a localhost alatt szeretném látni a projectemet, hanem a "http://localhost/projectem" alatt ?
Előre is köszi a segítséget.
Ez csak a felszín
Az MVC egész lényegét vágja haza az, aki a cache-ből kiveszi a templatet és elkezd bele SQL-t irogatni.
Pontosan erre szolgálnak a partialok ( nem partion ).
jelölés: _nev
A partialok arra lettek kitalálva, hogy egy alapértelmezett megjelenítést egy általunk preferáltal felül lehessen ütni. Pl adott a user osztály feltöltve minden adattaggal és mi a név helyére teszem azt a nickname-t akarjuk tenni. Ebben az esetben rendelkezésre álló függvényekkel akarunk operálni tehát a lib átíársa nem indokolt.
Következő lépés, amikor az új komponenshez adatbázis művelet is szükséges. - Component
jeloles: #nev
Erre a célra szolgálnak a komponensek. A komponens lényege, hogy hozzá egy action is tartozik. Az actionben lefutnak az adatbázis kezelő rutinok és a template megjeleníti az eredményt.
PeerMethod
Ezzel a két eszközzel egy fapados generált kódot is gyorsan fel lehet javítani, de nem szabad megfeledkezni a teljesítményről. A partial-t akkor van értelme használni, ha a rendelkezésre álló objektum fel van töltve a megfelelő adatokkal. Gyakori, hogy idegen kulcsokon keresztül linkelt tábláknál az idegen kulcs helyére a megnevezés mezőt kell tenni. Ebben az esetben a torzsObject->getCsatoltObject()->getMegnvezes() hivas először adatbázisból feltöltené a megfelelő csatoltObject-et. Ami azt jelenti, hogy egyetlen query helyett rengeteg fut, ami egy kisebb listánál is komoly teljesítmény csökkenéshez vezet.
Erre a célra találták ki a PeerMethod lehetőségét, ahol is a lista által által felhasznált metódust lehet beállítani. A keretrendszer alapból generál belső joinokkal ellátott peer metódusokat, ezek használatával az object lekérdezéskor a megfelelő irányú 1:N kapcsolatokat feloldja és az objektumot a csatolt objektummal együtt kérdezi le. pl TorzsObjectPeer::doSelectJoinCsatoltObject()
Lib
Természetesen bonyolultabb problémák esetén saját peer metódust lehet definiálni, aminek segítségével eléggé messzire lehet eljutni. Ehhez persze már lib szinten kell ügyködni. Ezt is elég jól támogatja a symfony, mint szinte minden osztály alapú programfunkciót. Ugyanis minden osztályból rögtön kettőt generál, az egyik mindig az automatikus tartalommal ellátott a másik pedig az ebből származó üres osztály. Az üres osztályokat a symfony csak inicilaizálja, de sosem generálja felül. Éppen ezért a generált osztályokat hagyjuk békén, és minden változtatást tegyünk az üres osztályokba.
Ha egy általánosan elérhető osztályra van szükségünk megint csak a lib-ben kell turkálni. Tipikus példa lehet egy kosár osztály, ami mind a frontend mind a backend felületen elérhető. Amennyiben nem tároljuk a kosár tartalmakat külön táblában, akkor nem is lesz generált skeleton osztály sem.
Szóval a cikk igencsak felületes, pont ezért sajnálatos, hogy egészen az AJAX-ig repül. Az alapokat átugrottad szerintem.
aha
Nem tudom miről beszélsz, az eredeti tutorialhoz ennek semmi köze, ha csak annyi nem hogy azt is olvastam anno.
Nem is ez volt a cél.
Nem tudom hol látsz ilyet a cikkben. Erről a cikkről van szó egyáltalán?
...
Igen, pont az volt a lényeg, hogy ne menjek bele a részletekbe, hanem egy általános bemutatást írjak.
mea culpa
És pontosan ez az a pont, ahol nem értünk egyet, hiszen szerintem igenis egy ilyen komplexitású rendszerhez kell némi segítség az elején. Ilyesfajta ízelítő elég kevés szerintem, inkább csak összezavar, mintsem képet ad arról, hogy milyen szintekig lehet fel, illetve lejutni. A symfonyt elsősorban azoknak ajánlanám, akik összetett web alapú alkalmazást akarnak fejleszteni.
adott a lehetőség
Üdv,
Felhő
en is varom
Igazabol a tobb adatbazis kozotti adatmozgast, szinkronizalast, egyuttes (ket vagy tobb adatbazis kozotti tablak osszevetese) lekerdezest segito adatbazis absztrakcios reteget keresek, persze szigoruan jogosultsag ellenben. :-)
Udv
Sanyi
Doctrine
inkább xsl