Symfony - kako početi?

Poslednjih godina PHP je zahvatila struja kojom se taj skript programski jezik podigao na jedan viši, reklo bi se, profesionalniji nivo. Zapravo radi se o PHP paketima (php framework) koji služe kao alati za brži i sigurniji razvoj internet aplikacija. Njihova namena je prvenstveno bila da se gotovi alati iz jedne tehnologije sastave u jedan praktični okvir pa da se tako nastali paket koristi kao jedan kompletan alat. Tako bi programer bez razmišljanja imao na raspolaganju osnovne funkcionalnosti tehnologije koju koristi i posvetio se samo logici aplikacije koju gradi, problemima organizacije fajlova, klasifikacije objekata i bezbednosti.

Mi ćemo govoriti o jednom takvom framework-u koji je poslednjih godina postao jedan, ako ne najbolji, onda definitivno najpotpuniji framework na polici postojećih. Govorićemo o Symfony framework-u. Zvanična prva verzija je objavljena oktobra 2005. godine (http://symfony.com/legacy). 

Verzija operativnog sistema na kome ćemo raditi je Linux Ubuntu 12.04 LTS. U samom sistemu je potrebno da imamo instalirane Apache server i PHP 5+ kao i Mysql server. Kompletno video uputstvo kako da postavite razvojno okruženje možete pogledati ovde. Uputstvo je na španskom jeziku, međutim prilično je slikovito objašnjeno pa verujem da nećete imati problema da pratite celu proceduru.

Kroz ovaj serijal izgradićemo jedan manji blog kako bismo prikazali sve osnovne funkcionalnosti ovog alata. Najpre ćemo proći kroz instalaciju, pripremu okruženja, dodavanje alata ili “bundle” paketa u sam inicijalni paket symfony-ja, korišćenje komandne linije / terminala (command line), izgradnju “entity” elemenata, rad sa bazom i tako dalje...

Preuzimanje Symfony framework-a

Najbolji način da imate najsvežiju verziju ovog alata je da odete na direktno na sajt http://symfony.com/download i dovučete poslednju verziju framework-a. Aktuelna verzija u toku pisanja ovog teksta je 2.2.0. Preporučujem vam da kad skinete jednu verziju ostanete na njoj u toku razvoja aplikacije i ne radite nadogradnju na novije verzije, ili bar detaljno proučite razlike izmedju verzija i proverite da li vam novi ili izmenjeni delovi prave problem. Razlog tome je da se svaka distribucija razlikuje jednim malim delom od prethodne. Razlike mogu da budu u nazivima funkcija ili nekih "doctrine" objekata što može da pravi problem u vašem kodu. Te promene u podverzijama nisu velike, međutim skok sa verzije 1.4 na verziju 2.0, kada jesu napravljene velike promene (promenjen je sistem organizacije fajlova i datoteka, iskorišćeno je više potencijala samog PHP 5 jezika i još toga...), je ipak bio značajan, neki govore da je to skoro potpuno novi framework sa istim imenom.

Nakon što smo preuzeli paket raspakovaćemo ga na mesto gde ćemo našem projektu pristupati. U mom slučaju : “/home/nenad/projects”, a direktorijum ćemo nazvati Blog pa naša putanja postaje:

/home/nenad/projects/Blog

Naš root (korenski) direktorijum projekta Blog ima nekoliko interesantnih poddirektorijuma koje bi trebalo pomenuti:

  • app/ - u kome se nalaze konfiguracioni direktorijumi i fajlovi vezani za generalna podešavanja aplikacije: cache/, logs/, config/ direktorijumi. U njemu se  nalazi takođe i nekoliko fajlova od kojih je najvažniji AppKernel.php u kome treba definisati svaki novi “bundle” koji će se koristiti u aplikaciji.
  • src/ - je naš glavni direktorijum u kome se nalaze ili će se nalaziti svi fajlovi vezani za projekat koje mi pravimo ili generišemo. Na generisanje samog koda projekta ćemo se vratiti kasnije.
  • web/ - je jedini javni direktorijum projekta kome može da se pristupi pomoću pretraživača. Unutar njega ćemo smeštati naše javascript/, css/ i image/ direktorijume. On takođe sadrži i par bitnih fajlova app.php i app_dev.php koji su ustvari kontroleri koji regulišu okruženje u kome se radi. Okruženje predstavlja pristup stranici preko dev (development = razvojnog) okruženja gde je, recimo, keširanje strana isključeno zbog same brzine razvoja aplikacije ili preko prod (production = produkcionog) gde je keširanje strana uključeno zbog same brzine izvršavanja aplikacije.

Osim direktorijuma u našem root-u imamo i neke fajlove koji u manjoj ili većoj meri pomažu sam projekat. Korisni fajlovi, pogotovo u daljem razvoju i radu sa Symfony framework-om mogu da budu UPGRADE.md i UPGRADE-2.2.md koji u svom sadržaju prikazuju razlike između verzija samih Symfony 2.x distribucija. Osim njih imamo standardni README.md fajl sa osnovnim instrukcijama za pokretanje, instalaciju i osnovno korišćenje Symfony projekta.

Uz sam Symfony framework instaliraćemo još jedan alat koji će nam pomoći da ubrzamo razvoj naše aplikacije. To je composer.phar fajl. Composer je alat koji nam pomaže da brže izvršavamo upravljanje modulima od kojih projekat zavisi. Šta to znači? Recimo to ovako. Sam Symfony 2 projekat je prilično modularan u smislu da postoji skup nezavisnih alata unutar njega koji sinhronizovano - zavisno jedan od drugog ili potpuno nezavisno, svaki za sebe, funkcionišu kao celina. Kompletna sinhronizacija je podešena unutar specifičnih fajlova (kao npr. AppKernel.php) koji su, zapravo, ključni za funkcionisanje web aplikacije. Composer je alat koji kompletno podešavanje sinhronizacije i instalacije nezavisnih ili zavisnih modula / alata vrši transparentno pomoću jedne ili dve komande u terminalu. Sve što je potrebno uraditi je unutar fajla composer.json (koji već dolazi uz Symfony 2) dodati naziv modula koji nam je potreban i u terminalu pokrenuti komandu php composer.phar install  i to je sve, alat ce biti instaliran i spreman za korišćenje... Za sada ćemo ga samo instalirati u naš projekat. Dakle otvorite terminal, pozicionirajte se u root direktorijum i pokrenite komandu:

curl -s https://getcomposer.org/installer | php

Ukoliko nemate curl  instaliran možete otići direktno na sajt composer-a i preuzeti ručno fajl. Sama instalacija traje 3 ili 4 sekunde.

Upuststvo za instalaciju composera na osX i linux sistemima možete naći ovde, a za instalaciju na windows sistemu ovde. Periodično možete uraditi nadogradnju samog composer fajla tako što ćete u terminalu izvršiti komandu:

php composer.phar self-update

Nakon što instaliramo fajl u projekat možemo uraditi nadogradnju vendora (“vendor/” direktorijuma) tako što ćemo u terminalu izvršiti komandu:

php composer.phar update

Nadogradnja traje neko vreme što najviše zavisi od vaše internet konekcije, računara koji koristite kao i toga da li imate poslednju verziju Symfony framework-a. U slučaju da dobijete grešku proverite da li direktorijumi u app/cache i app/logs imaju pravo upisa za vaše korisničko ime.

Kada smo to završili, struktura projekta je spremna da se integriše u sistem.

Podešavanje Apache servera

Sledeći korak izgradnje aplikacije je podešavanje servera na kome će se izvršavati naš kod. Pošto ćemo raditi u lokalu (na našem lokalnom računaru), proći ću kroz proceduru podešavanja virtuelnog servera za naš Blog projekat.

Kao što ste primetili dosta stvari radimo iz terminala, ne samo u podešavanju okruženja za projekat već i za sam rad na projektu. Symfony dolazi sa dosta alata u terminalu koji pomažu i ubrzavaju rad na projektu.

Dakle prvi korak u podešavanju servera je postavljanje naziva samog servera. Najpre otvorite terminal. Zatim je potrebno da nađete hosts fajl na vašem sistemu. Za Ubuntu korisnike fajl se obično nalazi na lokaciji etc/:

sudo nano /etc/hosts

Nakon čega će vam se u terminalu otvoriti fajl. U zavisnosti od operativnog sistema već ćemo imati određeni sadržaj u fajlu, nešto kao:

127.0.0.1       localhost
 # The following lines are desirable for IPv6 capable hosts
 ::1     ip6-localhost ip6-loopback
 fe00::0 ip6-localnet
 ff00::0 ip6-mcastprefix
 ff02::1 ip6-allnodes
 ff02::2 ip6-allrouters
 

Na kraju svih redova dodajte liniju:

127.0.0.1 s2blog

Ukoliko u fajlu bude postojalo nešto kao “127.0.1.1”, taj red slobodno obrišite ili proglasite komentarom tako što ćete staviti znak “#” na početku reda. Značenje tog reda je inicijalizacija lokalnog servera sa imenom vašeg računara koja je izvršena od strane operativnog sistema, ali generalno takav naziv ume da pravi problem prilikom rada apache servera jer 127.0.1.1 ne predstavlja validnu adresu za localhost odnosno lokalni server. Zatim izvršite komande CTRL + O da sačuvate fajl i CTRL + X da izadjete iz njega. Na taj način sada imamo napravljen virtuelni server pod nazivom s2blog koji još uvek nije aktivan jer je potrebno ponovo pokrenuti apache server. Ali to ćemo uraditi pošto podesimo i sledeći korak.

Sledeći korak predstavlja podešavanje putanje odnosno, sledećim korakom obaveštavamo server gde se nalazi naš projekat. Prvi korak u tom slučaju je naći fajl koji se zove ili koji predstavlja vhosts (virtual hosts), odnosno naći fajl iz koga apache server preuzima podešavanja za svaku virtuelnu lokaciju koju opslužuje. Takođe u ovom slučaju naziv kao i lokacija vhosts fajla zavise od sistema kao i od verzije samog apache servera. U slučaju moje mašine i ovog operativnog sistema fajl ću otvoriti sledećom komandom u terminalu:

sudo nano /etc/apache2/sites-available/default

Na kraju fajla unesite sledeći kod i prilagodite putanje za DocumentRoot  i <Directory> da odgovaraju lokaciji vašeg projekta:

#------------- symfony 2 blog from scratch --------------#
 <VirtualHost *:80>
       ServerName s2blog  
       DocumentRoot /home/nenad/projects/Blog/web
       DirectoryIndex app.php
       <Directory "/home/nenad/projects/Blog/web">
               Options Indexes FollowSymLinks MultiViews
               AllowOverride None
               Order allow,deny
               allow from all
       </Directory>
 </VirtualHost>
 #------------- end of symfony 2 blog -------------------#

Vodite računa o tome da su putanje kao i nazivi fajlova osetljivi na mala i velika slova - precizno napišite putanju do projekta da bi sve radilo kako treba. Ono što je bitno primetiti je da putanja Document Root-a ide u web/ direktorijum našeg root direktorijuma, a da je naziv "Directory Index" fajla (index.php fajla) ustvari “app.php”. Kada sačuvate i izađete iz fajla potrebno je ponovo pokrenuti apache server da bi se konfiguracija i virtuelni server učitali u osnovnu konfiguraciju apache servera. Komanda za Ubuntu korisnike je :

sudo apachectl restart

Ako dođe do greške prilikom restarta servera proverite još jednom konfiguraciju u prethodna 2 fajla i probajte ponovo da restartujete server (možete pokrenuti i komandu "apachectl configtest" koja će izvršiti proveru vaše apache konfiguracije i reći vam precizno gde je greška, ako postoji). Kada restart prođe bez greške spremni smo za sledeći korak. Ako želite da proverite da li je vaš server “živ” posle podešavanja, možete jednostavno u pretraživaču kucati http://s2blog/ i trebalo bi da se pojavi nešto kao :

Bez obzira što server javlja grešku ova poruka takođe znači da odgovor postoji, odnosno da se server javlja, ali linije koda još uvek nisu ispisane, tako da možemo da kažemo da smo spremni da počnemo da gradimo projekat.

PHP podešavanje

Sledeći korak u celoj proceduri je provera instalacije vašeg PHP-a. Provera se sastoji iz 2 koraka. Prvi je generalna provera u terminalu, a drugi je provera provere, ali se ta druga provera vrši iz pretraživača. Symfony 2 kao izuzetno robustan projekat dolazi sa skriptom koja će izvršiti proveru da li je konfiguracija PHP-a na vašem računaru pravilno prilagođena da bi snaga samog Symfony alata mogla dostići svoj puni potencijal.

Da bismo izvršili proveru iz terminala najpre ćemo se postaviti u root direktorijum našeg projekta pomoću terminala:

cd /home/nenad/projects/Blog

a zatim ćemo izvršiti komandu:

php app/check.php

Ova komanda ispisuje na ekran terminala listu sa zahtevima Symfony paketa vezanih za PHP i statusima tih zahteva, kao i predlozima rešenja ako nešto nije kako treba. Lista provera je zaista velika tako da zaista nećemo imati prostora da je detaljno objašnjavamo. Ono što je bitno da znate da bi ona trebala da izgleda slično sledećoj listi:

* Configuration file used by PHP: /etc/php5/cli/php.ini
 ** ATTENTION **
 *  The PHP CLI can use a different php.ini file
 *  than the one used with your web server.
 *  To be on the safe side, please also launch the requirements check
 *  from your web server using the web/config.php script.
 ** Mandatory requirements **
 OK       PHP version must be at least 5.3.3 (5.3.10-1ubuntu3.6 installed)
 OK       PHP version must not be 5.3.16 as Symfony won't work properly with it
 OK       Vendor libraries must be installed
 OK       app/cache/ directory must be writable
 OK       app/logs/ directory must be writable
 OK       date.timezone setting must be set
 OK       Configured default timezone "Europe/Belgrade" must be supported by your installation of PHP
 OK       json_encode() must be available
 OK       session_start() must be available
 OK       ctype_alpha() must be available
 OK       token_get_all() must be available
 OK       simplexml_import_dom() must be available
 OK       APC version must be at least 3.0.17
 OK       detect_unicode must be disabled in php.ini
 OK       PCRE extension must be available
 ** Optional recommendations **
 OK       Requirements file should be up-to-date
 OK       You should use at least PHP 5.3.4 due to PHP bug #52083 in earlier versions
 OK       When using annotations you should have at least PHP 5.3.8 due to PHP bug #55156
 OK       You should not use PHP 5.4.0 due to the PHP bug #61453
 OK       PCRE extension should be at least version 8.0 (8.12 installed)
 OK       PHP-XML module should be installed
 OK       mb_strlen() should be available
 OK       iconv() should be available
 OK       utf8_decode() should be available
 OK       posix_isatty() should be available
 OK       intl extension should be available
 OK       intl extension should be correctly configured
 OK       intl ICU version should be at least 4+
 OK       a PHP accelerator should be installed
 OK       short_open_tag should be disabled in php.ini
 OK       magic_quotes_gpc should be disabled in php.ini
 OK       register_globals should be disabled in php.ini
 OK       session.auto_start should be disabled in php.ini
 OK       PDO should be installed
 OK       PDO should have some drivers installed (currently available: mysql)
 

Najbolji način da prevaziđete eventalne greške koje bi mogle da se dogode prilikom ove provere je da na osnovu opisa greške potražite na internetu rešenje za istu. Razlog tome je da biste i vi sami naučili, a takođe i to da je problematika grešaka prilikom provere sistema individualna za svaki sistem pojedinačno, pa čak i za verziju operativnog sistema, verziju servera i verziju samog php-a. Okvir ovog posta ne bi mogao da podrži jednu takvu opširnu analizu.

Dakle sledeći korak je provera u pretraživaču. Provera se vrši zbog toga što je moguće da server koristi jedan php.ini fajl u terminalu, a drugi u pretraživaču, pa je iz tog razloga potrebno proveriti i jednu i drugu lokaciju. php.ini fajl je konfiguracioni fajl koji server koristi da bi preuzeo i inicijalizovao podešavanja PHP-a. Lokacija u sistemu Ubuntu je obično u /etc/php5/cli/php.ini za terminal, a /etc/php5/apache2/php.ini za internet pretraživač.

U pretraživaču pišemo sledeći url:

http://s2blog/config.php

Ako je sve pravilno podešeno trebalo bi da dobijete stranicu kao na sledećoj slici.

U slučaju da se pojave greške, na isti način kao i u prethodnom slučaju ćemo ih rešavati dok ne sredimo sve koje su predstavljene. Ovim načinom rešavanja konfiguracionih problema Symfony nam daje mogućnost da maksimalno optimizujemo radno okruženje kako bismo mogli da najefikasnije iskoristimo potencijal framework rešenja.

Kada se oslobodimo svih greškaka koje su pred nama, krećemo dalje tako što pratimo link:

Configure your Symfony Application online

Link nas vodi u konfigurisanje baze i ostalih parametara korak po korak.

Moguće je da pošto odete na link dobijete grešku tipa :

Greška znači da u app/cache direktorijumu nisu dozvoljena prava upisa za korisnika koji se izvršava u pretraživaču. U tom slučaju u terminalu (naravno iz root direktorijuma projekta) ćemo da izvršimo komandu koja će dozvoliti sva prava za upisivanje u direktorijume i poddirektorijume u app/cache i app/logs:

sudo chmod -R 777 app/cache/;
 sudo chmod -R 777 app/logs/;

NAPOMENA: app/logs i app/cache lokacijama moraju biti dozvoljena prava pristupa za korisnike iz pretraživača

Pošto smo i to završili nastavljamo na sledeći korak:

Taj sledeći korak je popunjavanje parametara baze pomoću web forme koju symfony generiše. Polja sa forme su:

  • Driver - Bira se koji je tip baze na kojoj se radi (MySql, PosgreSql, MsSql ...)
  • Host - (IP) Adresa baze. Za lokalnu mašinu potrebno je samo upisati “localhost”
  • Name - Ime baze na koju ćemo da se povezati prilikom obrade ili ažuriranja podataka
  • Path - opcioni parametar koji predstavlja eventualnu putanju do baze
  • Port - opcioni parametar koji predstavlja port preko koga se komunicira sa bazom
  • User - korisničko ime za bazu
  • Password - šifra

Potrebno je, naravno, da napravimo bazu sa kojom ćemo raditi. Nije potrebno popunjavanje baze, ali samo ime baze je potrebno napraviti i korisnika baze koji će imati sve dozvole za rad sa njom. U mom slučaju ime baze je s2blog i korisnik koji radi sa bazom je istog imena s2blog.

Pošto popunimo formu sa osnovnim podacima o bazi, produžimo klikom na dugme “Next Step”. Sledeći korak je generisanje tajnog koda odnosno “ključa” koji će se koristiti za šifrovanje prilikom čuvanja podataka u našoj bazi, kao i prilikom prenosa podataka kroz naš sajt.

Osim osnovnih čuvanja podataka ova tajna šifra će se koristiti i za CSRF (Cross-Site Request Forgery) zaštitu koja predstavlja dodatnu unikatnu zaštitu svakog sajta od napada kopiranjem linka. To je zapravo potvrda da korisnik u svom pretraživaču direktno pristupa sajtu i da radi u njemu. Ukoliko bi link do određene lokacije na sajtu bio kopiran od korisnika sa druge lokacije, pristup istom linku ne iz pretraživača aktuelnog korisnika već iz drugog (stranog) pretraživača ne bi bio dozvoljen, verifikacija CSRF koda za taj drugi pretraživač ne bi bila validna pa bi tako podaci aktuelnog korisnika bili zaštićeni, a samim tim i pristup sajtu od strane neautorizovanog korisnika bi bio blokiran...

Kada izgenerišemo željeni kod, ponovo kliknemo na “Next Step”.

Taj, zapravo, poslednji korak je prikaz svih do sad podešenih parametara vezanih za bazu i tajni ključ.

U tom koraku je potrebno da tekst koji nam je generisao Symfony kopiramo u fajl koji se zove parameters.yml. Putanja do tog fajla u mom slučaju je :

/home/nenad/projects/Blog/app/config/parameters.yml

A zašto ručno kopiramo u fajl? Razlog je jednostavan; parameters.yml fajl nema dozvole upisa za korisnika koji se izvršava u pretraživaču, što je normalno i tako treba da ostane. Pa je zbog toga potrebno da napravimo još jedan mali napor i da kopiramo kompletan sadržaj podešavanja i da time završimo kompletnu konfiguraciju.

To bi bilo to što se tiče same konfiguracije Symfony paketa. Dalje što možemo da uradimo pošto iskopiramo podešavanja u fajl je da pratimo link :

Go to the Welcome page

taj link nas vodi na stranu :

koja predstavlja početnu stranu Symfony paketa. Na njoj postoji nekoliko linkova na kojima se možete bliže upoznati sa alatom, pokrenuti demonstraciju ili eventualno ponovo konfigurisati bazu i parametre... Možemo da primetimo da se link na kome se nalazi ova strana http://s2blog/app_dev.php/ završava sad app_dev.php što predstavlja kontroler, kao što smo pominjali ranije, koji usmerava na razvojno okruženje naše aplikacije. Generalno “Welcome” strana nam govori da je naš projekat uspešno konfigurisan i čeka na naše instrukcije. Dakle sad je vreme da zaronimo u generisanje koda.

Prvi Bundle

Projekti u okviru Symfony framework-a se nalaze u src/ direktorijumu, organizovani u pakete (u fizičkom smislu - direktorijume) koji kao grupa ne predstavljaju ništa drugo do jednu logičku celinu. Generalno taj paket (bundle) se može postaviti bilo gde u okviru projekta sve dok se putanje koje vode do njega pozivaju na pravi način.

Dakle da bismo napravili naš prvi “bundle” idemo u terminal, pozicioniramo se u root direktorijum i izvršimo sledeću komandu:

php app/console generate:bundle

Šta ova komanda znači ?

  • php - znači da se poziva fajl koji će se parsirati php kompajlerom
  • app/console - lokacija fajla koji se koristi za izvršavanje komandi u terminalu
  • generate:bundle - komanda za generisanje paketa u kome ćemo čuvati naše fajlove

Genaralno gledano ovo je šablon na osnovu koga ćemo izvršavati sve komande iz terminala:

php app/console "KOMANDA"

Ako izvršite samo php app/console u terminalu će nam se izlistati sve moguće komande koje postoje u framework-u, odnosno koje je moguće izvršiti iz terminala.

Pošto smo pokrenuli generisanje bundle-a trebalo bi da dobijemo sledeći tekst na ekranu terminala:

Welcome to the Symfony2 bundle generator  
                                      
 Your application code must be written in bundles. This command helps you generate them easily.
 
 Each bundle is hosted under a namespace (like Acme/Bundle/BlogBundle).
 
 The namespace should begin with a "vendor" name like your company name, your project name, or your client name, followed by one or more optional category sub-namespaces, and it should end with the bundle name itself (which must have Bundle as a suffix).
 
 See http://symfony.com/doc/current/cookbook/bundles/best_practices.html#index-1 for more details on bundle naming conventions.
 
 Use / instead of \  for the namespace delimiter to avoid any problem.
 
 Bundle namespace: 
 

Tekst predstavlja vodič kroz generisanje paketa. Proćićemo zajedno kroz postupak.

Dakle prvo pitanje koje imamo je :

Bundle namespace:

Koje predstavlja naziv, a istovremeno i putanju do našeg bundle-a. U ovom koraku ćemo upisati:

Project/BlogBundle

Project” predstavlja naziv direktorijuma u src/ direktorijumu projekta, a “BlogBundle” predstavlja naziv direktorijuma našeg paketa. Pritisnemo Enter na tastaturi da bismo dobili sledeće pitanje:

In your code, a bundle is often referenced by its name. It can be the concatenation of all namespace parts but it's really up to you to come up with a unique name (a good practice is to start with the vendor name).
 Based on the namespace, we suggest ProjectBlogBundle.
 Bundle name [ProjectBlogBundle]:
 

Sledeće što treba da uradimo je da dodelimo ime našem paketu. Na osnovu naziva projekta i naziva bundle-a koje smo već uneli dobili smo predlog “ProjectBlogBundle”, ukoliko želimo da ovo bude naše referencijalno ime za bundle samo pritisnemo Enter na tastaturi. Međutim ja bih više voleo da mi dodelimo drugo ime, razlog tome je što će se referencijalno ime koristiti  više nego jednom pa smatram da bi bilo komplikovano da pišemo toliko dugačak naziv. Za “Bundle name:” ćemo uneti naziv BBundle. Zašto “BBundle? Prvo “B” dolazi od naziva Blog, a “Bundle” je reč koju je potrebno upotrebiti u ovom slučaju, Symfony insistira na tome. Isti slučaj je i sa pravljenjem “namespace” naziva za naš projekat. “Bundle” je praktično rezervisana reč koja ima konfiguracionu upotrebu u Symfony framework-u. Ukoliko se ne poštuju ti propisani standardi prilikom inicijalizacije naziva doći će do greške.

Sledeće pitanje na koje je potrebno da odgovorimo je :

The bundle can be generated anywhere. The suggested default directory uses the standard conventions.
 Target directory [/home/nenad/projects/Blog/src/]:
 

Pitanje putanje je, kao što sam rekao, relativna stvar, bitno je da se samo ispravno navede i gde god budemo koristili bundle, radiće ispravno. A pošto mi želimo da bundle postavimo u src/ direktorijum, samo ćemo potvrditi ponuđenu putanju.

Dalje:

Determine the format to use for the generated configuration.
 Configuration format (yml, xml, php, or annotation):
 

Postavlja se pitanje formata sa kojim će biti inicijalizovani konfiguracioni fajlovi i putanje u našem projektu. Ja lično preferiram .yml format pošto je za ljudsko poimanje jednostavan, a uz to je lak za čitanje pa ćemo i u ovom slučaju inicijalizovati njega. Upišite yml i pritisnite Enter.

To help you get started faster, the command can generate some code snippets for you.
 Do you want to generate the whole directory structure [no]?
 

Na ovo pitanje ćemo odgovoriti sa “Enter” jer nam kompletna struktura direktorijuma nije potrebna, samo ono što ćemo mi koristiti, a ostatak ćemo kasnije sami napraviti. Zatim imamo jedan mali pregled svega i pitanje da li želimo da potvrdimo generisanje projekta:

Summary before generation  
 You are going to generate a "Project\BlogBundle\BBundle" bundle
 in "/home/nenad/projects/Blog/src/" using the "yml" format.
 
 Do you confirm generation [yes]? 
 

Pritisnite “Enter” da konačno izvršimo generisanje direktorijuma i fajlova našeg inicijalnog paketa. Kada potvrdimo dobijamo izveštaj:

Bundle generation  
 
 Generating the bundle code: OK
 Checking that the bundle is autoloaded: OK
 Confirm automatic update of your Kernel [yes]?
 

Zatim potvrdimo automacko ažuriranje koda,

Enabling the bundle inside the Kernel: OK
 Confirm automatic update of the Routing [yes]?
 

Potvrdimo automacko ažuriranje putanja do našeg projekta i dobijemo rezultat:

Importing the bundle routing resource: OK
 You can now start using the generated code!
 

Što znači da je naš kod uspešno generisan.

Ako sada pogledamo strukturu našeg projekta videćemo da je u src/ direktorijum dodat novi direktorijum pod nazivom Project. Struktura tog paketa izgleda ovako:

Project
   -BlogBundle
     -Controller
        DefaultController.php
     -BExtension.php
        BExtension.php
        Configuration.php
     -Resources
        -config
           config.yml
           routing.yml
        -views
          -Default
             index.html.twig
     -Tests
        -Controller
           DefaultControllerTest.php
     BBundle.php    
 

Kao što možemo da vidimo Symfony je napravio osnovnu direktorijumsku strukturu koja će nam služiti da možemo inicijalno da raspoređujemo fajlove i da gradimo naš sajt. Osim foldera “Project” došlo je do još nekih promena. U /app/AppKernel.php u okviru registerBundles() funkcije dodata je linija koda:

new Project\BlogBundle\BBundle()
 

koja registruje naš bundle u okviru projekta, a na lokaciji

/app/config/routing.yml

je dodat konfiguracioni kod:

b:
 resource: "@BBundle/Resources/config/routing.yml"
 prefix:   /
 

koji inicijalizuje putanje našeg s2blog sajta na nivou cele aplikacije.

Sada možemo da testiramo našu aplikaciju.

Pošto smo generisali projekat iz terminala Symfony nam je inicijalno napravio DefaultController.php fajl u /src/Project/BlogBundle/Controller direktorijumu koji predstavlja inicijalni kontrolni fajl, kao i osnovnu putanju b_homepage sa putanjom /hello/{name} u direktorijumu /src/Project/BlogBundle/Resources/config/routing.yml. {name} predstavlja parametar kome je naziv “name”, a { i } zagrade označavaju da je to promenljiv parametar - u njemu može da bude bilo koja vrednost.

U pretraživač upišite url:

http://s2blog/app_dev.php/hello/PHPSrbija

trebalo bi da dobjete nešto kao na slici ispod:

I to bi bilo to. Projekat je sad spreman za rad. Inicijalna strana je napravljena. Symfony je podešen tako da više nećete morati da ga podešavate ni sa novim projektima. Ono što će biti potrebno ako budete počinjali novi projekat biće da napravite novi server u hosts fajlu, da podesite parametre tog servera i naravno da konfigurišete bazu.

U okviru samog Symfony framework-a postoji inicijalni bundle koji se zove AcmeDemoBundle. Unutar njega su navedeni primeri kako se neke stvari rade u samom Symfony projektu. On može da vam služi kao okvir na osnovu koga ćete da pravite direktorijume, da nazivate direktorijume i fajlove. Generalno može da vam pomogne ako rešite da se oslanjate na njegovu strukturu. Ja lično preferiram da nemam dodatne direktorijume koje neću upotrebljavati pa ću tako još opisati proceduru kako se uklanja bundle iz projekta. Procedura je sledeća:

  • najpre ćemo ukloniti ceo Acme/ direktorijum iz glavnog src/ direktorijuma
  • zatim ćemo iz fajla /app/config/routing_dev.yml ukoniti sledeće linije koda:
    _welcome:
        pattern:  /
        defaults: { _controller: AcmeDemoBundle:Welcome:index }
     _demo_secured:
        resource: "@AcmeDemoBundle/Controller/SecuredController.php"
        type:     annotation
     _demo:
        resource: "@AcmeDemoBundle/Controller/DemoController.php"
        type:     annotation
        prefix:   /demo
     
  • sledeći korak je da iz fajla /app/AppKernel.php uklonimo liniju
    $bundles[] = new Acme\DemoBundle\AcmeDemoBundle();
  • i poslednji korak u našem slučaju je da obrišemo direktorijum web/bundles/acmedemo

Generalno bi bilo potrebno da obrišemo i bezbednosne konfiguracione postavke u /app/config/security.yml fajlu, ali pošto ćemo ih koristiti u narednim lekcijama za sada ćemo ih ostaviti kakve jesu.

Kompletno uputstvo za uklanjanje AcmeDemoBundle paketa možete naći i u README.md fajlu od linije teksta 89 do linije teksta 104 .

To bi bilo sve za ovu prvu, moguće, najdužu i najkompleksniju lekciju upoznavanja sa Symfony framework-om.

U narednom postu ćemo se malo detaljnije uključiti u kod, napravićemo prve stranice i instalirati sistem za logovanje...