Skip to content

Instantly share code, notes, and snippets.

@mosbth
Created December 9, 2011 07:24
Show Gist options
  • Save mosbth/1450608 to your computer and use it in GitHub Desktop.
Save mosbth/1450608 to your computer and use it in GitHub Desktop.
Tutorial, bygga Lydia

08:00 <@mos> hupp 08:00, vilka anmäler sig för tjänstgöring?

08:06 <@mos> Ok. Se till att ni har ert befintliga ramverk framför er, eller start med en tom katalog och en source.php (min start). Vi kommer att använda forumet och tillsammans göra en tutorial för hur man bygger ett PHP-baserat MVC-inspirerat CMF. Ramverket är döpt till Lydia och senaste versionen kommer att finnas på http://dbwebb.se/lydia, där finns även source.php. Om två minuter postar jag första forumtråden och sen kodar vi loss. Antingen bygger ni kod som jag gör eller så hackar ni själva. Det är bra om ni läst några MVC tutorials så att vi kan kritisk granska den koden som jag föreslår. Har ni andra förslag så gör dem här eller kanske bättre i forumet. Varje liten delövning av Lydia kommer att vara en forumtråd.

08:10 < marvin> Senast hänt i forumet: Tutorial Lydia: Bygg ett PHP-baserat MVC-inspirerat CMF (http://dbwebb.se/forum/viewtopic.php?t=46&p=123#p123) av mos

08:13 <@mos> Jag ger er någon minut att komma iordning, sen kör jag igång med första delen, vilket innebär att jag själv måste koda... första delen blir alltså att fixa .htaccess och en index.php, vilket ger oss en tänkt grundstruktur. Jag kommer att följa den struktur som finns i Medes och det finns alltså läge för att kritiskt granska varför mina lösningar är bättre eller sämre än de som vi kan finna i diverse MVC-tutorials, eller i ditt egna ramverk.

08:28 <@mos> har en fungerande .htaccess och en index.php som tar emot alla requester samt har möjlighet att tolka dem. testa: http://dbwebb.se/lydia/ och http://dbwebb.se/lydia/mumintroller/baka/salt/peppar/socker/vatten

08:30 <@mos> Med hjälp av det vi har nu, kan vi översätta urlen till en controller/action/arg1/arg2/arg3, detta kallar vi första steget

08:32 <+snafu> call_user_func_array <3

08:35 <@mos> :) kommer

08:36 <@mos> Ok, jag stoppade in det jag gjort i foruminlägget Skicka alla requester till index.php (http://dbwebb.se/forum/viewtopic.php?f=14&t=45), där är det

08:39 <@mos> Medans ni läser så kör jag vidare med nästa steg vilken blir att strukturera index.php, ett viktigt steg för mig eftersom det sätter en grundstruktur för Lydia.

08:51 <@mos> Ok: Lydia: Grundstrukturen i index.php (http://dbwebb.se/forum/viewtopic.php?f=14&t=47&p=124#p124)

08:53 <@mos> Så tänker alltså jag, här kan vi se skillnader mellan olika tutorials, eller nyanser av skillnader. Jag bygger ut lite av koden i index.php, så kan ni se hur jag tänker, samtidigt kan ni kritiskt granska det med tanke på vad ni läst i mvc-tutorials, skriv gärna er kritik eller alternativa förslag som svarstråd i forumet.

09:16 * mos kodar mera... nu blev det en del... kodar lite till...

09:17 <@mos> hup: då var vi tillbaka: http://dbwebb.se/lydia/mumintroller/baka/salt/peppar/socker/vatten

09:19 <@mos> men nu hände det en del. studera katalogstrukturen och utgå från index.php. se de faser jag valde att använda och studera koden för respektive fas, nu kan det vara läge för frågor. jag ska skriva av det jag gjorde i forumet och lägga in lite kodexempel.

09:20 <@mos> starta alltså med index.php och utgå därifrån: http://dbwebb.se/lydia/source.php?dir=&file=index.php (så återkommer jag när jag fixat fouminlägget...)

10:02 <@mos> då ska vi se. vi kör ett upprop igen, hur många är med oss? (tror alla länkar finns samlade här: http://dbwebb.se/forum/viewtopic.php?f=14&t=46)

10:02 <@mos> Upprop!

10:03 < wasa> kalle

10:03 < Sylvanas> jag är med nu, men inte varit med nu tidigare på morgonen

10:03 < Sylvanas> har en del att ta igen, tror inte jag hinner ikapp

10:03 < Bella> sitter fortfarande kvar också..

10:04 < jjjj> här :) Sylvanas: Det är inte så mycket du missat, finns bra trådar skapade med instruktioner

10:04 < sphinxen_> jag är kvar.. med bredband.. :P

10:04 < mandagsexemplar> jag är med kvar

10:04 < Sylvanas> jag är på någon annans bredband

10:06 <@mos> Ok, jag ska fixa in koden till github så långt vi kommit nu. det tar ett par minuter.

10:07 <@mos> jag uppdaterade templateengingerender och skrivet ut innehållet i $ly, då ser ni vad det innehåller så här långt. tanken med $ly att dett det är en hållare, en form a Register-class, som har tillgång till allt. http://dbwebb.se/lydia/mumintroller/baka/salt/peppar/socker/vatten

10:08 <@mos> Registry är ju ett koncept vi ser i andra MVC tutorials.

10:08 * mos fixar github

10:12 <@mos> ok, verkar som kodexemplet funkar så här långt va, jag tror jag taggar det så vi har en kopia vi kan gå tillbaka till.

10:14 < mandagsexemplar> än så länge verkar jag tänkt rätt vettigt med allt jag skrev igår :)

10:14 <@mos> här är lyda on github: https://github.com/mosbth/lydia

10:15 < jjjj> Kan man inte lika bra ta bort $ly = &$this; i CLydia, och sen använda $this->cfg i config?

10:15 <@mos> jo

10:15 <@mos> stämmer

10:16 < jjjj> Någon fördel att göra som du eller bara för att visa tydligare att det är lydia-klassen?

10:17 <@mos> ne, ingen fördel, mest att jag vill jobba med $ly (eller $pp i medes) som ett välkänt globalt koncept. din lösning funkar lika bra.

10:18 < jjjj> Okej, tänkte det. Testade att byta men kom på mig själv att jag tyckte det var lite otydligare, så jag gick tillbaka mot din lösning :)

10:18 <@mos> vill man komma åt den koden som finns så här långt kan man alltid checka ut taggen v0.01, denna version av koden kan man också se här: https://github.com/mosbth/lydia/tree/v0.01

10:22 <@mos> sådär: då är jag nog redo att gå vidare tror jag. gisten uppdaterad så här långt (https://gist.github.com/1450608) och redo att skapa det tredje inlägget i tutorialen som är sammanställd här: http://dbwebb.se/forum/viewtopic.php?f=14&t=46&p=123#p123. :)

10:23 <@mos> Vi har alltså klarat av två delsteg så här långt, "Lydia: Skicka alla requester till index.php" samt "Lydia: Grundstrukturen i index.php" och varje steg har sin egen forumtråd där vi kan prata diskutera respektive steg.

10:25 <@mos> jag antar att vi får ge oss på $ly->FrontControllerRoute och dessutom skapa en CCtrlIndex, en index controller. Det blir en liten mastig uppgift men det är ju nu det roliga börjar.

10:27 <@mos> Jag börjar med en forumtråd, sen kodar jag. Först blir det att parsa urlen för att plocka ut controller/action/arg1/arg2 osv. därefter skall rätt metod i rätt controller anropas. sen är det upp till kontrollern att leka vidare, men det får bli nästa steg. .

10:27 * mos går till forumet...

10:39 <@mos> marvin: latest

10:39 < marvin> Senast hänt i forumet: CMS, MVC, ramverk och avancerad webbutveckling • Lydia: Frontcontroller route (http://dbwebb.se/forum/viewtopic.php?t=48&p=126#p126) av mos

10:39 <@mos> Där ser ni min grundtanke, nu är det dags att skriva koden.

10:40 * mos kodar i CLydia:FrontControllerRoute

10:50 <@mos> hep. steg 1 klart, att analysera urlen och plocka ut controller, action, arg1, arg2 utifrån /controller/action/arg1/arg2: http://dbwebb.se/lydia/mumintrollet/baka/salt/peppar/socker/vatten

10:51 <@mos> Här är koden så här långt: http://dbwebb.se/lydia/source.php?dir=src&file=CLydia.php#L33

10:52 <@mos> Som ni kan se så har jag kopierat in en hel del kod från medes, nu måste jag "bara" skära bort överflödig kod för att få ett så enkelt exempel som möjligt. En lagom utmaning...

10:55 <@mos> jag förutsätter att mod_rewrite funkar och plockar bort kod som stödjer alternativa requester.

11:07 <@mos> hup: Nu är jag klar med steg 2 & 3, urlen är parsad och alla dess delar är lagrade i $ly->req.

11:08 <@mos> I medes ligger hela denna hanteringen i en egen klass, CRequest, och $pp->req är en instans av den klassen. Så det ser ungefär likadant ut. När koden växer vore det nog smart att lyfta ut denna biten till en CRequest, men så här långt funkar den ju här.

11:09 <@mos> Kör ni http://dbwebb.se/lydia/mumintrollet/baka/salt/peppar/socker/vatten så ser ni hela innehållet i $ly

11:10 <@mos> Nu när jag ser det så blandar jag array $ly->cfg och objekt $ly->req, ser lite skumt ut men om vi tänker oss att $ly har tillgång till allt i ramverket så kommer dess innehåll att bli rätt stort efter ett tag så det får nog vara så.

11:11 <@mos> denna kodedelen blev nog både enklare och kanske lite bättre än i medes, så kan det gå... :)

11:03 < Sylvanas> vad har du ReflectionClass till?

11:12 <@mos> då till Sylvanas fråga om ReflectionClass som jag använder för att kolla om controller och action finns och är möjliga att anropa. Denna biten stal jag från en av de PHP-böcker jag pratat om.

11:13 <+snafu> men reflection.. finns andra sätt att göra

11:14 < mandagsexemplar> ReflectionClass körde jag också med.

11:14 <+snafu> reflection i java är farligt

11:14 <@mos> yep, snafu har ett alternativt sätt. men jag kodar med reflektion eftersom... bara därför jag känner för det :) det är bra om vi kan se alternativa sätt i forumet sen.

11:16 * mos kodar loopen med ReflektionClass...

11:17 * mos samt fixen med enablde controllers i config.php...

11:17 * mos hämtar mer vatten...

11:39 <@mos> hep, det händer saker. nu fungerar steg 4 där alla controllers måste defineras i config.php ($ly->cfg['controllers']), det görs nu en check på att den valda kontrollern finns, nu skall den bara naropas också... : http://dbwebb.se/lydia/mumintrollet/baka/salt/peppar/socker/vatten

11:41 <@mos> Uppdatera dig på källkoden i steg 4: http://dbwebb.se/lydia/source.php?dir=src&file=CLydia.php#L64 och testa olika controllers. http://dbwebb.se/lydia/mumintrollet/baka/salt/peppar/socker/vatten (är definerad) http://dbwebb.se/lydia/index (definerad) http://dbwebb.se/lydia/no_such_controller (finns inte)

11:44 <@mos> Hittade ett fel på rad 39: http://dbwebb.se/lydia/source.php?dir=src&file=CLydia.php#L39 (nu rättat, använde REDIRECT-URL tidigare...)

11:44 <@mos> Verkar funka, då ska vi se om vi kan anropa metoden i controllern också, med hjälp av Reflektion metoderna.

11:51 <@mos> Hup, nu ett steg till i koden: http://dbwebb.se/lydia/mumintrollet/baka/salt/peppar/socker/vatten

11:51 <@mos> lade till en default exception handler i CLydia och instansierade den i construktorn, typiskt bra att ha.

11:52 < wasa> får tempoväxla om vi ska hinna innan 12

11:52 <@mos> Se där, hanteringen fungerar, http://dbwebb.se/lydia/mumintrollet/

11:52 <@mos> Vi är strax i mål!

11:53 <@mos> Låt mig bara hacka ihop en metod i CCtrl4Mumintrollet som heter Baka() samt tar in 4 ingredienser som argument :D

11:54 <+snafu> usch klarar inte av ditt prefix på det.. brr

11:56 <@mos> Ne, det är ju en fix för att lägga alla klasser i samma katalog, men där kan man ju göra som man vill

11:57 <@mos> http://dbwebb.se/lydia/mumintrollet/baka/salt/peppar/socker/vatten

11:57 <@mos> Jippekayee, grunden i ett MVC-ramverk och klar innan kl 12:00 :D

11:58 < Sylvanas> lunch nu

11:58 <@mos> Frågor på det? ;P

12:01 <@mos> gjorde git push: https://github.com/mosbth/lydia

12:04 <@mos> Koden så här långt är taggad: https://github.com/mosbth/lydia/tree/v0.02

12:24 < Sylvanas> hur gör man sen ett grafiskt gränssnitt? genom egna controllers osv?

12:25 <@mos> Nästa steg vore att få ett tänk på TemplateEngingeRender och hur controllerna skall kunna lagra info/content/innehåll i $ly för att sedan skriva ut allt i CLydia::TemplateEngingeRender.

12:29 <@mos> Det kan vara lite trixigt och det finns flera alternativa sätt. Jag skulle nog välja att låta kontrollers spara info til $ly->views[]. När kontrollerns är klar så överlämnas all makt åt TemplateEngineRender som inkluderar en template-fil med mixad HTML och skript-PHP som skriver ut innehållet i $ly->views[] på "rätt plats".

12:30 < Sylvanas> och innehållet i views är då för de olika sektionerna i sidan?

12:31 <@mos> Ja, så hade jag gjort det. $ly->views['main'] .= $this->GetBlogEntry();

12:31 <+snafu> fast mos, det beror lite på utav din tolkning utav "views" och hur du har tänkt att göra med temat och det sen

12:32 <@mos> ja, här finns flera uppslag till diskussioner om terminologi, och det som beskrivs som vyer i MVC-tutorials på nätet är inte riktigt samma sak.

12:33 <+snafu> Sen blir det ju lite skillnad mellan mvc och mvs mellan olika språk också

12:33 <@mos> Jag är ju mycket influerad av hur CMS:erna gör i sina teman och ett renoldad MVC-ramverk har normalt en viss syn på Views.

12:33 < wasa> tema känns ju som en view som har onödigt mycket logik om man skall se det ur ett riktigt MVC tänk

12:34 <@mos> ja, så kan man nog säga

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment