Model-View-Controller

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

Här kommer ett enkelt ex på hur man skulle kunna jobba med MVC. Vi kommer att utvidga detta framöver
Controllers och Models är i princip fria från HTML, i views har man endast enkel PHP och HTML

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 därför är katalogerna forum och user tomma

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

Lab - med klasser

  • Ni skall göra ett forum med hjälp av klasser som uppfyller alla krav i lab 5, ni skall utgå ifrån min kod och lägga till det som saknas.
  • Ni skall använda er av klasserna service_db, model_user och service_session
  • Ni skall jobba med controller, model och views enligt den metod jag har visat er och som finns i min exempel kod nedan.
  • Ni skall göra minst en controller (forumController)
  • Ni skall göra minst en model (model_forum) som bör använda sig av någon av mina klasser.
    Lämpliga metoder skulle kunna vara:
    addThread, getThreads, addItem, getItems changeItem, deleteItem mm.
  • Ni ska göra ett antal views

Ni får gärna göra om och bygga ut mina klass exempel.

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

  • När man har loggat in skall man kunna ändra sina egna uppgifter och kunna ladda upp en profilbild som skall synas på lämpliga ställen i forumet. (userController + övrigt som man behöver göra)
  • Man skall kunna se lite mer information om en användare, när den gick med, hur många och vilka trådar den har skapat, hur många inlägg den har skrivit mm.

Min tabell Users

CREATE TABLE IF NOT EXISTS `lab5_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`)
) ENGINE=MyISAM