Visa föregående ämne :: Visa nästa ämne |
Startad av: |
Meddelande |
Saurid


Medlem i: 6071 dagar Från: Perstorp
Status: Offline
#707804
|
Skrivet: 2011-05-22 17:27
Ämne: Up MVC: Minimalistiskt OO MVC för utbildningssyfte
|
|
|
Jag har satt ihop ett mycket enkelt och no-nonsense ramverk baserat på MVC-principen (Model View Controller) och med Front Controller. Riktat till den avancerade nybörjaren som vill lära sig lite mer om OOP och MVC. Den totala storleken på själva ramverket ligger på bara några Kb. Så funktionerna är väldigt rudimentära, men det går ändå att göra mycket.
Tanken är att ni som velat lära er lite mer om ObjektOrientering och MVC ska ha något litet att titta på (kanske innan ni ger er på de större ramverken). Koden är gjord så att den är så enkel att greppa som möjligt. Inga komplicerade relationer mellan olika objekt, utan allt är väldigt basic.
View består av en mycket enkel template-klass (view.php) där du sätter variabler som du sedan skriver ut med php i dina HTML-mallar som lagras i app/view-mappen.
Model bygger du upp med enkla klasser och metoder som du kan anropa ifrån controller-lagret och skicka vidare data (ofta som arrays) till view för utskrift. Behöver du använda mySQL finns det en enkel wrapper (database.php) över PDO.
Controller-lagret utgörs av en Front Controller (frontcontroller.php) som startas från index.php. Front Controllern laddar in och kör dina egna controllers/actions (oftast i app/controller-mappen) beroende på URL'n. Du har så klart möjlighet att skicka med variabler till din controller via URL också.
Instruktioner för installation finns i readme-filen i paketet och dokumentation följer med som exempelsida.
Ladda ner på GitHub här:
https://github.com/saurid/UpMvc2
Senast ändrad av Saurid den 2013-01-29 00:56, ändrad totalt 14 gånger |
|
|
_________________ waljefors.se :: waeke.se :: GitHub :: SoundCloud :: Bandcamp |
Till toppen på sidan |
|
ludvig_d

Medlem i: 4699 dagar
Status: Offline
#707811
|
Skrivet: 2011-05-22 19:00
Ämne:
|
|
|
Klockrent! Ska helt klart kollas in! |
|
|
_________________ "Och som förklaring på det du skriver kan jag säga att om det fungerar fast det inte fungerar så fattas ett trasigt fel som inte syns fast nånting är trasigt, och på samma sätt men annorlunda. Men lika skillnad om du inte ändrat det som är annorlunda." |
Till toppen på sidan |
|
Saurid


Medlem i: 6071 dagar Från: Perstorp
Status: Offline
#707812
|
Skrivet: 2011-05-22 19:48
Ämne:
|
|
|
Tips:
Det går att sätta SITE_PATH till
define('SITE_PATH', str_replace('/index.php', '', $_SERVER['SCRIPT_NAME']));
i config-filen för att dynamiskt sätta rätt sökväg till ramverket.
Konstanten används inte i de små exempelfilerna, men det blir enklare att inkludera andra filer och att hämta tex. bilder i view om du använder SITE_PATH. |
|
|
_________________ waljefors.se :: waeke.se :: GitHub :: SoundCloud :: Bandcamp |
Till toppen på sidan |
|
Sawny
Medlem i: 3813 dagar
Status: Offline
#707868
|
Skrivet: 2011-05-23 17:52
Ämne:
|
|
|
Kan du ge några exmepel på hur det funkar?
Vad behöver man inkludera?
Hur kallar man på saker och ting?
$this->load-view('sida', array());
$this->load-controller('controller');
$this->load-model('model');
eller hur funkar det?  |
|
|
_________________ HTML, CSS, PHP, JS |
Till toppen på sidan |
|
Saurid


Medlem i: 6071 dagar Från: Perstorp
Status: Offline
#707873
|
Skrivet: 2011-05-23 18:22
Ämne:
|
|
|
Sawny skrev: |
Kan du ge några exmepel på hur det funkar?
Vad behöver man inkludera?
Hur kallar man på saker och ting?
$this->load-view('sida', array());
$this->load-controller('controller');
$this->load-model('model');
eller hur funkar det? |
Absolut! Det finns en PDF i zip-filen som förklarar en del också.
Du behöver inkludera det som redan inkluderas i index.php. Dvs config.php och autoload.php. Efter det sköter autoloadern resten.
Jag har som sagt hållit allt så enkelt det bara går. Av den anledningen har jag inte någon loaderklass/objekt, utan för att starta en view i controllern och rendrera en layout gör du så här:
1: $view = new view(); 2: echo $view->render('layout');
|
Då rendrerar view innehållet i filen "view/layout.php". Man sparar ingen kod på att använda en loader, så varför inte göra det på enklast möjliga sätt. Fördelarna med en loader finns inte i en sån här liten MVC.
Nytt 2011-08-20:
Om du använder arv kan du använda view-objektet direkt. Då skriver du så här:
1: echo $this->view->render('layout');
|
Du kan också rendrera till en variabel om du vill:
1: $html = $this->view->render('din-html-template');
|
Din controller och action kallar du i regel på ifrån din URL. Genom att gå till "/waeke-up-mvc/controller/action/10" i webbläsaren så hämtar front controllern controllern "controller" och utför "action()"-metoden i den, samt skickar med "10" som argument till "action()".
En model hämtar du in genom att köra:
1: $post = new model_post();
|
Då skapar du en instans av klassen/modellen "model_post" som ligger i filen "model/post.php".
Nytt 2011-08-20:
Om du använder arv i din controller så kan du enkelt ladda in nya modeller genom att bara anropa dem enligt:
1: $post = $this->model->post->getById();
|
Där "post" är din model med classnamnet model_post.
Det finns ett litet exempel på både en view, en controller och en model i filen.
Här är ett exempel på default-kontrollern (controller_index) i webbshopen som jag nämnde i första inlägget:
1: 2: class controller_index 3: { 4: public function index() 5: { 6: $view = new view(); 7: $cart = new model_cart(); 8: $category = new model_category(); 9: $categories = $category->getAll(); 10: $item = new model_item(); 11: $items = $item->getLatest(); 12: 13: $view->set('title', 'Hem'); 14: $view->set('cart', $cart); 15: $view->set('categories', $categories); 16: $view->set('categorycount', count($categories)); 17: $view->set('category', 'Nya produkter'); 18: $view->set('items', $items); 19: $view->set('itemcount', count($items)); 20: $view->set('content', $view->render('items')); 21: 22: echo $view->render('layout'); 23: } 24: }
|
Använder du arv så skulle det bli som nedan:
1: 2: // Ärv från föräldern controller genom nyckelordet extends 3: class controller_index extends controller 4: { 5: public function index() 6: { 7: $categories = $this->model->category->getAll(); 8: $items = $this->model->item->getLatest(); 9: 10: $this->view->set('title', 'Hem'); 11: $this->view->set('cart', $this->model->cart); 12: $this->view->set('categories', $categories); 13: $this->view->set('categorycount', count($categories)); 14: $this->view->set('category', 'Nya produkter'); 15: $this->view->set('items', $items); 16: $this->view->set('itemcount', count($items)); 17: $this->view->set('content', $this->view->render('items')); 18: 19: echo $this->view->render('layout'); 20: } 21: }
|
Senast ändrad av Saurid den 2011-08-20 12:02, ändrad totalt 2 gånger |
|
|
_________________ waljefors.se :: waeke.se :: GitHub :: SoundCloud :: Bandcamp |
Till toppen på sidan |
|
Drayon
Medlem i: 5204 dagar
Status: Offline
#707905
|
|
|
|
Till toppen på sidan |
|
Saurid


Medlem i: 6071 dagar Från: Perstorp
Status: Offline
#707907
|
Skrivet: 2011-05-23 23:04
Ämne:
|
|
|
Tror inte jag sett innan, men jag gillar tanken. Grundtanken är precis samma princip som jag visar här.
Min view är dock lite mer flexibel eftersom den returnerar en sträng istället för att skriva ut den direkt. Det gör det möjligt att kombinera olika templates med varandra i controllern och inte bara rada upp dem efter varandra. Det ger dig också möjlighet att skapa dokument för att spara i textfiler eller skicka som mail. Det är inte alltid utskrift till webbläsaren som är önskvärd
Den korta videon tar inte heller upp en av de viktigaste sakerna - Hur controllern väljs baserat på URL. Han nöjer sig med att kommentera "determine what page you're on" och startar en funktion manuellt.
En sak som han tar upp, som jag inte nämnt, är att det kan vara praktiskt att skapa upp hjälpobjekt såsom modeller och annat i controllerns konstruktor. Då har du tillgång till dem i alla actions och slipper duplicera kod. Men om inte alla actions använder dessa objekt, så är det ju lite slöseri med minne och processorkraft En gyllene regel är att inte ladda in eller skapa objekt som inte kommer att användas.
EDIT:
Jag gillade denna också (nedan), som förklarar lite närmre vad MVC är och kort hur man använder det. Allt som nämns går lätt att omsätta till mitt mini-ramverk. Jag använder tex samma URL-format (CakePHP):
http://net.tutsplus.com/tutorials/other/mvc-for-noobs/ |
|
|
_________________ waljefors.se :: waeke.se :: GitHub :: SoundCloud :: Bandcamp |
Till toppen på sidan |
|
Sawny
Medlem i: 3813 dagar
Status: Offline
#707956
|
Skrivet: 2011-05-24 16:28
Ämne:
|
|
|
Har själv försökt net.tuts.com guiden och kommer nog modda om den lite med hjälp av din kod
Gillar att din kod funkar med hjälp av URLen.
"controller/action/10".
Däremot gillar jag mer att kalla på view via $this->load->view();
EDIT:
Vad i din kod gör URL:er som "controller/action/10" möjligt?
Ser inget i .htaccess filen eller någon annan fil som skapar denna möjlighet.
Senast ändrad av Sawny den 2011-05-24 18:40, ändrad totalt 1 gång |
|
|
_________________ HTML, CSS, PHP, JS |
Till toppen på sidan |
|
Saurid


Medlem i: 6071 dagar Från: Perstorp
Status: Offline
#707961
|
Skrivet: 2011-05-24 18:23
Ämne:
|
|
|
Sawny skrev: |
Däremot gillar jag mer att kalla på view via $this->load->view(); |
Jo, det kan absolut vara ett bra sätt. Men då behöver controllern en förälder att ärva och jag ville hålla mig ifrån det för enkelhetens skull Jag tänkte det var viktigt att kunna använda en konstruktor utan att behöva tänka på föräldern. |
|
|
_________________ waljefors.se :: waeke.se :: GitHub :: SoundCloud :: Bandcamp |
Till toppen på sidan |
|
Drayon
Medlem i: 5204 dagar
Status: Offline
#707974
|
Skrivet: 2011-05-25 08:32
Ämne:
|
|
|
Sawny skrev: |
Har själv försökt net.tuts.com guiden och kommer nog modda om den lite med hjälp av din kod
Gillar att din kod funkar med hjälp av URLen.
"controller/action/10".
Däremot gillar jag mer att kalla på view via $this->load->view();
EDIT:
Vad i din kod gör URL:er som "controller/action/10" möjligt?
Ser inget i .htaccess filen eller någon annan fil som skapar denna möjlighet. |
Om jag inte har förstått det fel så är det denna bit kod i FrontControllern som sköter det.
1: if (isset($_SERVER['PATH_INFO'])) {
2: $route = explode('/', $_SERVER['PATH_INFO']);
3: $this->controller = 'controller_' . $route[1];
4: $this->action = (isset($route[2]) ? $route[2] : 'index');
5: $this->parameters = array_slice($route, 3);
6: }
|
|
|
|
|
Till toppen på sidan |
|
Saurid


Medlem i: 6071 dagar Från: Perstorp
Status: Offline
#707986
|
Skrivet: 2011-05-25 11:21
Ämne:
|
|
|
Ja, frontkontrollern sköter routingen från URL för att hitta controller/action/parametrar.
Utan .htaccess så skulle länkarna vara:
/waeke-up-shop/index.php/controller/action/10
Det .htaccess gör är så att du "slipper" se och använda index.php i URL'n. $_SERVER['PATH_INFO'] innehåller alltså /controller/action/10, sedan är det bara enkel array-hantering för att räkna ut resten. |
|
|
_________________ waljefors.se :: waeke.se :: GitHub :: SoundCloud :: Bandcamp |
Till toppen på sidan |
|
Sawny
Medlem i: 3813 dagar
Status: Offline
#708016
|
Skrivet: 2011-05-25 17:14
Ämne:
|
|
|
Smart.. |
|
|
_________________ HTML, CSS, PHP, JS |
Till toppen på sidan |
|
Saurid


Medlem i: 6071 dagar Från: Perstorp
Status: Offline
#708084
|
Skrivet: 2011-05-26 18:44
Ämne:
|
|
|
Det är ett av de allra vanligaste sätten att lägga upp sitt MVC på. De flesta ramverken har en liknande (eller likadan) modell. Och visst fasen är det smart, man önskar lite att man kommit på det själv.  |
|
|
_________________ waljefors.se :: waeke.se :: GitHub :: SoundCloud :: Bandcamp |
Till toppen på sidan |
|
trexake
Medlem i: 5123 dagar Från: Järfälla
Status: Offline
#708096
|
Skrivet: 2011-05-27 00:55
Ämne:
|
|
|
Hej, funderar på hur dina modell klasser inkluderas. Ser funktionen __autoload(), men aldrig vart den anropas?
Alltså: Vart inkluderas modellerna? Tänkte göra ett eget litet MVC Ramverk i inlärningssyfte
Edit: Lärde mig hur __autoload() fungerar.
Satt o funderade lite över routes och hur man skall lägga till egna sådana. Kom fram till följande:
1: 2: public function __construct($routes) { 3: if (isset($_SERVER['PATH_INFO'])) { 4: $route = explode('/', $_SERVER['PATH_INFO']); 5: switch ($this->checkRoute($route,$routes)) { 6: case 1: 7: $this->parameters = array_slice($route,1); 8: break; 9: case 2: 10: $this->action = $route[2]; 11: $this->parameters = array_slice($route,2); 12: break; 13: default: 14: $this->controller = 'controller_' . $route[1]; 15: $this->action = (isset($route[2]) ? $route[2] : 'index'); 16: $this->parameters = array_slice($route,3); 17: } 18: } 19: } 20: 21: private function checkRoute($route,$routes) { 22: $route = array_slice($route,1,3); 23: if (in_array($route[0],$routes) or in_array($route[0].'/',$routes)) { 24: if (count($route) > 1) { 25: if (in_array($route[0].'/',$routes)) { return 2; } 26: } 27: return 1; 28: } 29: return 0; 30: } 31: 32:
|
Fungerar så här:
1: 2: $routes = array( 3: 'sida', //Sätter parametrar direkt 4: 'produkt/' //Sätter action(produkt), sedan parametrar 5: ); 6:
|
Funderar dock på om det går o göra lite snyggare, logiktänket är inte så bra så här dags. |
|
|
|
Till toppen på sidan |
|
Saurid


Medlem i: 6071 dagar Från: Perstorp
Status: Offline
#708103
|
Skrivet: 2011-05-27 11:13
Ämne:
|
|
|
Jag har faktiskt aldrig funnit behovet av egna/custom routes, så jag har inte funderat så mycket över det. Men det känns i ditt fall som att du egentligen bara vill kunna utelämna parametrar i URL'en och det är inte riktigt det jag tänker på som egna routes, utan mer någon sånt här:
http://code.google.com/p/routemap/
http://code.google.com/p/routemap/wiki/Manual
Implementationen blir mycket mer avancerad dock... |
|
|
_________________ waljefors.se :: waeke.se :: GitHub :: SoundCloud :: Bandcamp |
Till toppen på sidan |
|
|