Kan iemand een voorbeeldje geven van een simpel begin met MVC?
Ik heb al vele tutorials bekeken, maar kom er niet helemaal uit hoe te beginnen.
Ik wil een nieuwssysteem maken.


<?php
// newsitem.controller.php
class NewsitemController
{
  private $_model;

  public function __construct($model)
  {
    $this->_model = $model;
  }

  public function create($id)
  {
    $this->_model->create($id);
  }

  public functin getAll()
  {
    $this->_model->getAll();
  }
}

// newsitem.model.php
class NewsitemModel
{
  private $_database;

  public function __construct($database)
  {
    $this->_database = $database;
  }

  public function create($data)
  {
    
  }

  public function getAll()
  {
    // hier komt de database actie..
  }
}

// index.php
$model = new NewsitemModel($database);

$controller = new NewsitemController($model);
$controller->create($_GET["id"]);
?>

// newsitem.html
<h1><?php echo $title; ?></h1>
<p><?php echo $message; ?></p>
Roy B op 26/05/2014 16:30:35

Hoe ziet zo'n view er dan uit? En hoe stuurt de controller de data naar de view?



controller - newsController.php
<?php
class NewsController extends BaseController
{
public function indexAction()
{
$model = $this->load->model('newsModel');
$newsitems = $model->latest();

$data = array(
'title' => 'Nieuws',
'newsitems' => $newsitems,
);

$this->loadview('latest_news' , $data);
}
}
?>
model - newsModel.php
<?php
Class NewsModel extends BaseModel
{
public function latest()
{
return $this->db->query("SELECT * FROM newsitems ORDER BY created DESC LIMIT 10");
}
}
?>

view - latest_news.php

!doctype html>
<html>
<head>
<meta charset="utf-8">
<title><?php echo $title; ?></title>
</head>

<body>
	<h1>Laatste Nieuws</h1>
	<?php
		foreach($newsitems as $newsitem)
		{
			echo $newsitem['title'] . '<br>';
		}
	?>
</body>
</html>
En wat doet $this->loadview("latest_news", $data) precies?
Deze laat de view en vult de variabele?
Die laadt de view inderdaad (denk aan include 'latest_news.php';).Maar eerst gaat de functie loadview() de $data dat een array is omzetten naar gewone variabelen.

$data['title'] wordt dan $title. Hiervoor wordt de PHP functie extract() gebruikt:

http://nl1.php.net/extract
Oke duidelijk!
Ik maakte voorheen gebruik van DataMappers en haalde in mijn template de variable op met $newsitem->getTitle().
Dit is nu niet meer toepasselijk lijkt mij aangezien alle data nu direct wordt meegegeven aan de view?

@Frank Nietbelangrijk,
Kun je een voorbeeldje geven van hoe de methode load_view eruit ziet?
Waar wordt de locatie van de view meegegeven?
Roy B op 27/05/2014 15:29:34

Ik maakte voorheen gebruik van DataMappers en haalde in mijn template de variable op met $newsitem->getTitle().
Dit is nu niet meer toepasselijk lijkt mij aangezien alle data nu direct wordt meegegeven aan de view?

Jawel, je kunt nog steeds data mappers gebruiken, maar je koppelt dan de controller (C) aan de mapper, niet de view (V). Je mappers worden zo een deel van het model (M) en, beter nog, het enige deel van het model dat zichtbaar is voor controllers.

Ward van der Put op 27/05/2014 15:39:34
Jawel, je kunt nog steeds data mappers gebruiken, maar je koppelt dan de controller (C) aan de mapper, niet de view (V). Je mappers worden zo een deel van het model (M) en, beter nog, het enige deel van het model dat zichtbaar is voor controllers.

Kun je hier een voorbeeldje van geven? Ik begrijp niet helemaal wat je bedoelt.
Je kunt mappers zien als de interfaces van het model. Bijvoorbeeld je class User (een controller) communiceert niet rechtstreeks met de database, maar uitsluitend via een class UserMapper. Je model (M) in de MVC-opzet wordt dan een ui waarvan alleen de buitenste schil, de mappers, toegankelijk is voor controllers.

class User <-> class UserMapper <-> class DataAccessObject <-> Database
Oke duidelijk!
De DataMapper is dus een laag tussen de Controller en het Model?

Dan mijn volgende vraag:
Ik wil een database gaan koppelen, maar is dit een beetje de juiste manier?


<?php
// newsitem.model.php
class NewsitemModel
{
  private $_database;

  public function __construct($database)
  {
    $this->_database = $database;
  }
}

// config.php
$host = "localhost";
$database = "";
$username = "";
$password = "";

$pdo = new PDO("mysql: host='.$localhost.'; dbname='.$database.'", "'.$username.'", "'.$password.'");

// news.php
include "config.php";

$model = new NewsitemModel($pdo);

$controller = new NewsitemController($model);
$controller->getAll();
?>
>> De DataMapper is dus een laag tussen de Controller en het Model?

Nee, de DataMapper is een invulling van de Model laag.
>> Nee, de DataMapper is een invulling van de Model laag.

Haha, blijft lastig hoewel het toch al wat duidelijker wordt.

Als ik het dus goed begrijp, kun je in plaats van:

<?php
$user_mapper = new UserMapper();
$user = $user_mapper->load(12); // 12 is het ID van de User
?>
Ook dit doen:

<?php
$user_model = new UserModel();
$user = $user_model->load(12);
?>
Zelfde principe alleen een ander naampje?

Toevoeging op 27/05/2014 17:12:31:

[offtopic]
Is een mapper of model een class die je statisch zou kunnen maken?

<?php
$user = UserMapper::load(12);
?>
[/offtopic]

Reageren