Up MVC: Minimalistiskt OO MVC för utbildningssyfte

PHPportalen Forum Index » Tips och Trix
Lägg ett bokmärke på hela tråden
Skapa nytt inlägg   Svara på inlägget Gå till sida 1, 2, 3, 4, 5, 6  Nästa
Visa föregående ämne :: Visa nästa ämne  
Startad av: Meddelande
Saurid
Moderator



Medlem i: 5491 dagar
Från: Karlshamn
Status: Offline



#707804
Inlägg Skrivet: 2011-05-22 17:27      Ämne: Up MVC: Minimalistiskt OO MVC för utbildningssyfte Citera

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
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
ludvig_d



Medlem i: 4119 dagar

Status: Offline



#707811
Inlägg Skrivet: 2011-05-22 19:00      Ämne: Citera

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
Visa användarprofil Skicka privat meddelande
Saurid
Moderator



Medlem i: 5491 dagar
Från: Karlshamn
Status: Offline



#707812
Inlägg Skrivet: 2011-05-22 19:48      Ämne: Citera

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
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
Sawny



Medlem i: 3233 dagar

Status: Offline



#707868
Inlägg Skrivet: 2011-05-23 17:52      Ämne: Citera

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? Smile
 

_________________
HTML, CSS, PHP, JS
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Saurid
Moderator



Medlem i: 5491 dagar
Från: Karlshamn
Status: Offline



#707873
Inlägg Skrivet: 2011-05-23 18:22      Ämne: Citera

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? Smile

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:
PHP:
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:
PHP:
1:
 echo $this->view->render('layout'); 


Du kan också rendrera till en variabel om du vill:
PHP:
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:
PHP:
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:
PHP:
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:
PHP:
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:
PHP:
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
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
Drayon



Medlem i: 4624 dagar

Status: Offline



#707905
Inlägg Skrivet: 2011-05-23 22:25      Ämne: Citera

Tack! Detta var verkligen intressant. Ska plockas isär och undersökas noggrant Wink

Har du sett den här?
http://net.tutsplus.com/tutorials/php/create-your-first-tiny-mvc-boilerplate-with-php/
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Saurid
Moderator



Medlem i: 5491 dagar
Från: Karlshamn
Status: Offline



#707907
Inlägg Skrivet: 2011-05-23 23:04      Ämne: Citera

Drayon skrev:
Har du sett den här?
http://net.tutsplus.com/tutorials/php/create-your-first-tiny-mvc-boilerplate-with-php/

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 Smile

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 Wink 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
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
Sawny



Medlem i: 3233 dagar

Status: Offline



#707956
Inlägg Skrivet: 2011-05-24 16:28      Ämne: Citera

Har själv försökt net.tuts.com guiden och kommer nog modda om den lite med hjälp av din kod Smile
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
Visa användarprofil Skicka privat meddelande
Saurid
Moderator



Medlem i: 5491 dagar
Från: Karlshamn
Status: Offline



#707961
Inlägg Skrivet: 2011-05-24 18:23      Ämne: Citera

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 Smile 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
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
Drayon



Medlem i: 4624 dagar

Status: Offline



#707974
Inlägg Skrivet: 2011-05-25 08:32      Ämne: Citera

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 Smile
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.

KOD:
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
Visa användarprofil Skicka privat meddelande
Saurid
Moderator



Medlem i: 5491 dagar
Från: Karlshamn
Status: Offline



#707986
Inlägg Skrivet: 2011-05-25 11:21      Ämne: Citera

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
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
Sawny



Medlem i: 3233 dagar

Status: Offline



#708016
Inlägg Skrivet: 2011-05-25 17:14      Ämne: Citera

Smart..
 

_________________
HTML, CSS, PHP, JS
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Saurid
Moderator



Medlem i: 5491 dagar
Från: Karlshamn
Status: Offline



#708084
Inlägg Skrivet: 2011-05-26 18:44      Ämne: Citera

Sawny skrev:
Smart..

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. Smile
 

_________________
waljefors.se :: waeke.se :: GitHub :: SoundCloud
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
trexake



Medlem i: 4543 dagar
Från: Järfälla
Status: Offline



#708096
Inlägg Skrivet: 2011-05-27 00:55      Ämne: Citera

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 Smile

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:
PHP:
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:

PHP:
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
Visa användarprofil Skicka privat meddelande MSN Messenger
Saurid
Moderator



Medlem i: 5491 dagar
Från: Karlshamn
Status: Offline



#708103
Inlägg Skrivet: 2011-05-27 11:13      Ämne: Citera

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
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
Visa tidigare inlägg:   
Skapa nytt inlägg   Svara på inlägget Gå till sida 1, 2, 3, 4, 5, 6  Nästa
PHPportalen Forum Index » Tips och Trix
Hoppa till:  
Du kan inte skapa nya inlägg i det här forumet
Du kan inte svara på inlägg i det här forumet
Du kan inte ändra dina inlägg i det här forumet
Du kan inte ta bort dina inlägg i det här forumet
Du kan inte rösta i det här forumet
Du kan inte bifoga filer i detta forum
Du kan inte ladda ner filer från detta forum
Kontakta oss på adressen: info@phpportalen.net
Webbplatsen bygger i grunden på phpBB © 2001, 2002 phpBB Group

Modifieringar har senare gjorts i systemet av PHPportalen
Sid och logotypdesign skapad av Daren Jularic