banansplitt™ Skrevet 22. mars 2009 Del Skrevet 22. mars 2009 (endret) God dag. Jeg fant ingenting om at dette ikke var lov, men jeg synes det er praktisk å kunne samle alt i en egen tråd slik at vi slipper å ha rundt 30 tråder med dumme spørsmål. Jeg er i gang med å lage en applikasjon ved å benytte MVC (Model View Controller). Har sett gjennom tutorials og litt og har så vidt startet. Jeg ser at de i tutorialene gjør det ekstra vanskelig med mye avanserte saker og mye jeg insinuerer er fullstendig unødvendig. I stedet for å skrive side inn og side ut med ting jeg ikke mener hører hjemme, så prøvde jeg meg på min egen lille versjon. index.php finner ut via urlen hvilken controller den skal hente. I en tutorial jeg så ble det skrevet en lang index.php med en hel haug funksjoner og mye annet tull. Her er min: <?php // Forespurt URL $url = $_SERVER['REQUEST_URI']; // Fjerner root fra URL $url = str_replace('/points/', '', $url); // Splitter resultatet $matches = explode('/', $url); $controller = $matches[0]; $argument = $matches[1]; $id = $matches[2]; // Velger controller if($controller == 'blog' || $controller == 'portfolio' || $controller == 'movies' || $controller == 'info') { include($_SERVER['DOCUMENT_ROOT'].'/points/controller/'.$controller); } else { echo 'finner ingen controller'; } ?> Er koden stygg? Kan jeg gjøre ting bedre? Mangler det noe? Skrik ut! Dette prosjektet er for å lære meg PHP på en ordentlig og ryddig måte. Endret 22. mars 2009 av Points Lenke til kommentar
Alex Moran Skrevet 22. mars 2009 Del Skrevet 22. mars 2009 Den er i hvertfall svært lite fleksibel. Lenke til kommentar
banansplitt™ Skrevet 22. mars 2009 Forfatter Del Skrevet 22. mars 2009 På hvilken måte? Lenke til kommentar
aCa Skrevet 22. mars 2009 Del Skrevet 22. mars 2009 Er målet med den koden, bare at du skal hente ut parametre fra url'en? Hvis du skal lage ett større prosjekt med MVC så ville jeg vurdert å benytte meg av ferdige PHP ramme verk slik som f.eks symfony, prado eller andre. De fleste støtter url omskrivning native slik at du lett kan lage fine url'er på forskjellige formater og slipper lage kode for dette selv. Så noen kommentarer på koden. (mine personlige preferanser og andre vil sikkert være uenige) Jeg ville sjekket at verdiene du henter far $matches faktisk er satt med isset før du prøver å hente dem, i tilfelle $url har færre parametre enn du forventer. Ett annet alternativ jeg er veldig glad i, er å benyte regular expressions. Hvis formatet på urlen din alltid er /points/$controller/$argument/$id kan man bruke en regex som dette: preg_match('/^\/points\/(.+)\/(.+)\/(.+)\/$/i', $_SERVER['REQUEST_URI'], $matches); Da holder det bare å sjekke isset på $matches så vil du se om alle verdiene er satt eller ikke. Før du inkluderer den filen med include, ville det vært en ide å sjekke om filen faktisk eksisterer eller føler du at du har dekket det med å bare godta ett par kontrollere? Kanskje det hadde holdt å sjekke om $controller er gyldig verdi hvis filen faktisk eksisterer? Da vil du slippe å legge til nye gyldige controllere i if setningen hver gang det blir noen forandringer. Hadde du ikke spurt etter kommentarer så hadde jeg aldri kommentert disse tingene siden koden din er helt ok Lenke til kommentar
Alex Moran Skrevet 22. mars 2009 Del Skrevet 22. mars 2009 Du må hardkode inn hver eneste controller. Hadde vært bedre å kjøre en sjekk på om controlleren eksisterte. F.eks. 1. Request: /articles/edit/id 2. Sjekke om filen ArticlesController.php eksisterer og inkluder den, hvis ikke, kast exception 3. Sjekke om klassen ArticlesController eksiterer (class_exists(...)), hvis ikke, kast exception 4. Kjør metoden editAction() om den eksisterer. Lenke til kommentar
banansplitt™ Skrevet 22. mars 2009 Forfatter Del Skrevet 22. mars 2009 (endret) Er målet med den koden, bare at du skal hente ut parametre fra url'en? Hvis du skal lage ett større prosjekt med MVC så ville jeg vurdert å benytte meg av ferdige PHP ramme verk slik som f.eks symfony, prado eller andre. Muligens ved en senere anledning, men akkurat nå skal jeg lære, og da blir det litt dumt å bruke ferdiglaget. Takk til begge for kommentarer! Nøyaktig hva jeg var ute etter i denne tråden. Skal lese dem nøye og prøve å få det til. Endret 22. mars 2009 av Points Lenke til kommentar
banansplitt™ Skrevet 22. mars 2009 Forfatter Del Skrevet 22. mars 2009 Jeg ville sjekket at verdiene du henter far $matches faktisk er satt med isset før du prøver å hente dem, i tilfelle $url har færre parametre enn du forventer. Eneste jeg trenger foreløpig er controlleren. $argument og $id trenger ikke å være satt og dette sjekker jeg i controlleren. Ett annet alternativ jeg er veldig glad i, er å benyte regular expressions. Hvis formatet på urlen din alltid er /points/$controller/$argument/$id kan man bruke en regex som dette:preg_match('/^\/points\/(.+)\/(.+)\/(.+)\/$/i', $_SERVER['REQUEST_URI'], $matches); Da holder det bare å sjekke isset på $matches så vil du se om alle verdiene er satt eller ikke. Alle parameterene trenger ikke være satt da f.eks. om kun $controller er satt vil den vise forsiden på f.eks. blogg. Før du inkluderer den filen med include, ville det vært en ide å sjekke om filen faktisk eksisterer eller føler du at du har dekket det med å bare godta ett par kontrollere? Kanskje det hadde holdt å sjekke om $controller er gyldig verdi hvis filen faktisk eksisterer? Da vil du slippe å legge til nye gyldige controllere i if setningen hver gang det blir noen forandringer. Done. <?php // Forespurt URL $url = $_SERVER['REQUEST_URI']; // Fjerner root fra URL $url = str_replace('/points/', '', $url); // Splitter resultatet -> setter sammen filplassering $matches = explode('/', $url); $controller = $matches[0]; $argument = $matches[1]; $id = $matches[2]; $filename = $_SERVER['DOCUMENT_ROOT'].'/points/controller/'.$controller.'.php'; // Sjekker at controller eksisterer -> kjører controller if(file_exists($filename)) { include($filename); echo 'filen eksisterer'; } else { echo 'finner ingen controller'; } ?> Lenke til kommentar
itsmebth Skrevet 22. mars 2009 Del Skrevet 22. mars 2009 Vil bare nevne at det du har nå er et include-skript og ikke et MVC-rammeverk. Vil anbefale at du leser http://en.wikipedia.org/wiki/Model%E2%80%9...80%93controller og ser litt på rammeverk som Zend Framework, Rails, Django (bruker MVT, ikke MVC) o.l. Lenke til kommentar
banansplitt™ Skrevet 22. mars 2009 Forfatter Del Skrevet 22. mars 2009 (endret) Det er jo bare starten av det hele. Eller mener du at jeg har gjort det helt feil allerede? Endret 22. mars 2009 av Points Lenke til kommentar
itsmebth Skrevet 22. mars 2009 Del Skrevet 22. mars 2009 Det er ganske stor forskjell på et include-skript og et MVC-rammeverk, og jeg vil si at den metoden du har nå vil egne seg svært lite senere. Som sagt så anbefaler jeg deg å se på andre rammeverk (jeg ble veldig glad i Zend Framework, men har nå nesten sluttet helt med PHP av diverse grunner). Lenke til kommentar
banansplitt™ Skrevet 24. mars 2009 Forfatter Del Skrevet 24. mars 2009 Jeg har dessverre en tendens til å skumme gjennom flere video-tutorials for å prøve å skjønne ting. Ender opp slik som nå. Tenkte jeg skulle sette meg ned nå og gå gjennom alle de 13 delene og kode av nøyaktig det han skriver. Så får vi se om jeg kommer tilbake med en ny index.php-fil som forhåpentligvis er riktig. Lenke til kommentar
banansplitt™ Skrevet 26. mars 2009 Forfatter Del Skrevet 26. mars 2009 Det er ganske stor forskjell på et include-skript og et MVC-rammeverk I video-tutorialen så gjøres det på en annen måte. Han bruker regulære uttrykk (?) for å lese av URLen. Men prinsippet er jo det samme som jeg har. Lese av URLen, finne ut hvilken controller som skal brukes, og dermed inkludere denne controlleren. Skjønner ikke hvordan det da ikke kan være MVC-rammeverk (hvertfall starten på et) da han i video-tutorialen gjør det på den måten. Og det virker som om denne karen har en god del erfaring. Slik ser min index.php ut nå: <?php // Starter session session_start(); // Henter konfigurasjon include "config.php"; // Henter URL $url = $_SERVER['REQUEST_URI']; // Fjerner root fra URL $url = str_replace('/'.APP_ROOT.'/', '', $url); // Deler opp i controller, argument og id $url = explode("/", $url); $controller = $url[0]; $action = $url[1]; $id = $url[2]; // Sjekker om controller eksisterer if(file_exists(CONTROLLER_PATH.$controller.'.php')) { include(CONTROLLER_PATH.$controller.'.php'); } else { exit('Denne siden eksisterer ikke!'); } // Layout include(VIEW_PATH.'layouts'.DS.'application.php'); ?> .. den finner ut hvilken controller den skal bruke. Den henter controlleren (som jeg ikke har laget enda). I controlleren henter jeg modellen (eks. models/blog.php) slik at jeg har funksjonene klare. Etter dette finner jeg ut hvilken view som skal hentes, og henter den og kjører de funksjonene som må kjøres. models/blog.php: <?php /** * create_post * tilføyer en ny post i "blog" */ function create_post($params) { $connection = db_connect(); $query = sprintf ("INSERT INTO blog (title, body, created_at, user_id) VALUES ('%s', '%s', %d, %d)", mysql_real_escape_string($params['title']), mysql_real_escape_string($params['body']), mysql_real_escape_string($params['created_at']), mysql_real_escape_string($params['user_id']) ); $result = mysql_query($query); if(!$result) { return false; } else { return true; } } /** * update_post * oppdaterer en eksisterende post i "blog" */ function update_post($params) { $connection = db_connect(); $query = sprintf ("UPDATE blog SET title = '%s', body = '%s', edited_at = %d, user_id = %d WHERE id = %d", mysql_real_escape_string($params['title']), mysql_real_escape_string($params['body']), mysql_real_escape_string($params['edited_at']), mysql_real_escape_string($params['user_id']), mysql_real_escape_string($params['id']) ); $result = mysql_query($query); if(!$result) { return false; } else { return true; } } /** * delete_post * sletter en eksisterende post i "blog" */ function delete_post($id) { $connection = db_connect(); $query = sprintf ("DELETE FROM blog WHERE id = %d", mysql_real_escape_string($id) ); $result = mysql_query($query); if(!$result) { return false; } else { return true; } } ?> Har en del andre filer sånn som config.php, database.php osv. Men; er jeg helt på jordet her? Lenke til kommentar
banansplitt™ Skrevet 27. mars 2009 Forfatter Del Skrevet 27. mars 2009 (endret) Den forige posten er bare å glemme, det ble surr. Det jeg har gjort nå er å slette forige applikasjon jeg holdt på med. Denne gangen har jeg ikke lov å bruke video tutorialen, og alt jeg gjør må jeg enten finne ut selv, eller spørre om her. Jeg har nå kommet til routing-systemet, og sitter bom fast. Jeg skjønner absolutt ikke regex og det gjør at jeg ikke kommer lenger. Prøvde å titte gjennom en tutorial for regex, men jeg ble rett og slett svimmel. Jeg trenger regex som matcher disse url'ene: (Slash på slutten trenger ikke være der, men må kunne leses av selv om den er der.) rs = random string rd = random digit blog/ blog/rs/ blog/rs/rs/ blog/view/rd/ portfolio/ portfolio/rs/rs/ portfolio/view/rd/ Endret 27. mars 2009 av Points Lenke til kommentar
itsmebth Skrevet 28. mars 2009 Del Skrevet 28. mars 2009 (endret) $controllers = array('blog', 'portfolio'); $regex = sprintf('#%s(/(.-)(/(.+))?)?/?#', implode('|', $controllers)); Tror denne skal virke, men jeg har ikke prøvd den. Hvis du bare skal dele på '/' så er nok explode det beste valget. Endret 28. mars 2009 av itsmebth Lenke til kommentar
banansplitt™ Skrevet 28. mars 2009 Forfatter Del Skrevet 28. mars 2009 (endret) Fikk det til. Som dere kanskje har sett har jeg en funksjon som heter find_post. Denne henter ut den riktige posten etter spørring. Men det jeg lurer på: sånn som å gjøre om BB-kode, avsnitt osv. Skal jeg gjøre det i find_post eller skal dette inn i en ny funksjon? Endret 28. mars 2009 av Points Lenke til kommentar
Alex Moran Skrevet 28. mars 2009 Del Skrevet 28. mars 2009 Det kan du gjøre i en ny funksjon (helper) som du kaller i viewet. F.eks: function formatWithBbCode($string) {} I viewet: <div class="text"> <?php echo formatWithBbCode($article->getBody()) ?> </div> Lenke til kommentar
banansplitt™ Skrevet 28. mars 2009 Forfatter Del Skrevet 28. mars 2009 Tusen takk! Var litt usikker på om det var "lov" å kalle funksjoner osv. i viewet. Har forøvrig fått til MVC-rammeverket nå (tror jeg). Mye rusk osv, men jeg får hvertfall navigert meg mellom blogg-innlegg osv. Legger ut kode for "godkjenning" etterhvert. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå