Table of Contents

Model-View-Controller

Dags att börja diskutera hur man skulle kunna strukturera ett större projekt.

Syfte med uppgiften

Ett mindre ex på MVC

Här kommer ett enkelt ex på hur man skulle kunna jobba med MVC.
Controllers och Models är i princip fria från HTML, i views har man endast enkel PHP och HTML. Controllers skall sköta logik (lite kod) medan models skall lösa specifika uppgifter.

Det är viktigt att ha en tydlig struktur på hur man kodar!!

index.php

index.php - Denna fil har som enda uppgift att alltid läsa in rätt filer…

  1. Hämtar först diverse inställningar, sätter variabler och skapar tex ett databas och session objekt
  2. Kollar över vad som har kommit i $_GET['c'] c=controller och i $_GET['a'] a=action
  3. Läser in rätt controller - en controller sköter logiken, skriver aldrig ut något och kommunicerar med olika modeller
  4. Läser in rätt view, en view är till för att visa sidor - har bara enkel PHP och HTML
<?php
define('PATH','../'); // Sökvägen till själva applikationen
// alla inställnignar och några funktioner
include(PATH.'include/setup.php');
 
// Säkrar upp vad som kommer i $_GET['c'] c=controller och i $_GET['a'] a=action, kommer inget blir det index
(isset($_GET['c'])?str_replace('.','',$_GET['c']):$_GET['c'] = 'index');
(isset($_GET['a'])?str_replace('.','',$_GET['a']):$_GET['a'] = 'index');
 
// läser in rätt controller
$controller = PATH . 'controllers/' . $_GET['c'] . 'Controller.php';
if (file_exists($controller)) {
  include($controller);
} else {
  $session->AddError('No controller named:' . $_GET['c'] . 'Controller');
}
 
// visar HTML med rätt view
include(PATH.'views/head.php');
$session->PrintInfo();; // skriver ut fel och annan info
$view = PATH . 'views/' . $_GET['c'] . '/' . $_GET['a'] . '.php';
if (file_exists($view)) {
  include($view);
} else {
  $session->AddError('No view in ' . $_GET['c']. ' named:' . $_GET['a']);
  $session->PrintInfo(); // Man vill ju se detta fel också...
}
include(PATH.'views/foot.php');

Detta är min struktur av filer. Det enda som är gjort är en fungerade inloggning och möjlighet att hantera användare på ett primitivt sätt (om man är admin). När det gäller layout, HTML, placering av meny mm så är inget gjort.

mvc
├── classes
│   ├── model
│   │   ├── table.php
│   │   └── user.php
│   └── service
│       ├── db.php
│       └── session.php
├── controllers
│   ├── indexController.php
│   ├── loginController.php
│   └── userController.php
├── htdocs
│   ├── images
│   ├── index.php
│   └── style.css
├── include
│   └── setup.php
└── views
    ├── foot.php
    ├── head.php
    ├── index
    │   └── index.php
    ├── login
    │   ├── login.php
    │   ├── logout.php
    │   ├── register.php
    │   ├── sendpassword.php
    │   └── setpassword.php
    └── user
        └── index.php

Lite mer om klasser

Jag kommer att ha genomgång av mina klasser och då kommer jag att förklara följande:

När ni har fått kläm på hur detta fungerar så kommer ni förhoppningsvis se vissa fördelar med att använda er av denna kunskap.

Lab - med klasser

Krav

Inloggning (redan klart…)

Forum (vill ni göra något annat säg till så ska det nog gå att lösa)

När ni jobbar och upptäcker att något saknas i mina klasser så ska in gärna bygga ut mina klass exempel.

Ni ska hämta min kod här. Skulle det finnas några fel i den får ni fixa det själv :-)

Extrakrav

Min tabell Users

CREATE TABLE IF NOT EXISTS `Users` (
  `UserID` int(11) NOT NULL AUTO_INCREMENT,
  `FirstName` varchar(50) NOT NULL DEFAULT '',
  `LastName` varchar(50) NOT NULL DEFAULT '',
  `EMail` varchar(50) NOT NULL DEFAULT '',
  `Password` varchar(50) NOT NULL DEFAULT '',
  `Deleted` tinyint(1) NOT NULL DEFAULT '0',
  `Admin` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`UserID`),
  UNIQUE KEY `EMail` (`EMail`)
) ;