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 27/05/2014 16:21:22

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();
?>



Roy heb je al ervaring met het extenden van een class?
Je zou gewoon een BaseModel class kunnen maken die voorziet in de database connectie. Daarna extend je ieder Model van de BaseModel.

<?php
// base.model.php
class BaseModel
{
private $db; // lekker kort :p

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

// newsitem.model.php
class NewsitemModel extends baseModel
{
public function indexAction()
{
$newsitems = $this->db->getAll('newsitems');
//...
}
}

// blog.model.php
class BlogModel extends baseModel
{
public function indexAction()
{
$blogs = $this->db->getAll('blogs');
//...
}
}

?>

Roy B op 27/05/2014 15:29:34

@Frank Nietbelangrijk,
Kun je een voorbeeldje geven van hoe de methode load_view eruit ziet?
Waar wordt de locatie van de view meegegeven?


Dit is een héél erg eenvoudige loader. In werkelijkheid zijn er nog wel wat zaken om rekening mee te houden.

<?php
class BaseController
{
protected function loadView($name, $data);
{
extract($data);
unset($data);

include BASEDIR . '/views/' . $name . '.php';
}
}
?>
Frank Nietbelangrijk op 27/05/2014 21:39:40

Roy heb je al ervaring met het extenden van een class?
Je zou gewoon een BaseModel class kunnen maken die voorziet in de database connectie. Daarna extend je ieder Model van de BaseModel.


Nee, maar ik begin het wel te begrijpen.
Ik maak dus de verbinding met de database in mijn BaseModel? Moet ik deze dan ook iedere keer dat ik een Model gebruik de BaseModel aanroepen om een database verbinding te creëren?
Roy B op 27/05/2014 16:21:22

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

Nee dat is het niet. Door je gegevens van de connectie hardcoded in een php bestand te zetten mis je alle flexibiliteit. Als je morgen dezelfde code wilt gaan gebruiken op een andere site (of zelfs maar test en productie omgevingen wilt hebben), dan heb je al een probleem. Configuratie gegevens horen in een configuratie bestand (ini, xml, yaml) en niet in een php script bestand.
Maak van de connectie ook een class en zorg dat je zelfs die class nog eens zou kunnen vervangen. Bijvoorbeeld als je niet van een mysql database, maar van een db2 database gebruik gaat maken, om maar iets te noemen.

Roy B op 28/05/2014 09:02:57

[quote="Frank Nietbelangrijk op 27/05/2014 21:39:40"]
Roy heb je al ervaring met het extenden van een class?
Je zou gewoon een BaseModel class kunnen maken die voorziet in de database connectie. Daarna extend je ieder Model van de BaseModel.


Nee, maar ik begin het wel te begrijpen.
Ik maak dus de verbinding met de database in mijn BaseModel? Moet ik deze dan ook iedere keer dat ik een Model gebruik de BaseModel aanroepen om een database verbinding te creëren of roep ik deze eenmalig ergens aan?
[/quote]
Iemand nog tips?
>> Iemand nog tips?

Laat eens zien hoe ver je ondertussen bent?
Hier een klein gedeelte...


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

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

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

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

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

// model.php
class BaseModel
{
  private $_database;

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

// newsitem.model.php
class NewsitemModel extends BaseModel
{
  public function getAll()
  {
    $select = "SELECT * FROM newsitems";
    $query = $this->_database->query($select);
		
    if($query->rowCount() > 0)
    {
      return $query->fetchAll();
    }
  }
}

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

$model = new NewsitemModel($pdo);

$controller = new NewsitemController($model);
$newsitems = $controller->getAll();

foreach($newsitems AS $newsitem)
{
  echo "<h2>".$newsitem["title"]."</h2>";
}
?>

Helemaal geen slecht begin, hoor!

Je kunt verschillende dingen anders/beter doen, maar heb je zelf ergens specifieke vragen of twijfels over?

Ward van der Put op 03/06/2014 15:58:32

Helemaal geen slecht begin, hoor!

Je kunt verschillende dingen anders/beter doen, maar heb je zelf ergens specifieke vragen of twijfels over?

Thanks! :)
Sowieso zijn tips voor verbeteringen altijd welkom, dus als je tips hebt, graag!
Ik heb nog wel een vraag over het volgende..

Stel ik wil een newsitem ophalen a.d.v. de titel in de URL.
Bijvoorbeeld: ../nieuws/Eerste-nieuwsitem

Wat ik dan terug krijg is $newsitem["title"] etc.
In mijn view gebruik ik liever $titel i.p.v. $newsitem["title"]. Kan dat?

<?php
// newsitem.php
include "../includes/config.php";

$model = new NewsitemModel($pdo);
$controller = new NewsitemController($model);

if(isset($_GET["title"]) AND trim($_GET["title"]) != "")
{
  // Select Newsitem by title
  $newsitem = $controller->getByTitle($_GET["title"]);
}

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

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

  public function getByTitle($title)
  {
    $title = str_replace("-", " ", $title);

    return $this->_model->getByTitle($title);
  }
}

// newsitem.model.php
class NewsitemModel extends BaseModel
{
  public function getByTitle($title)
  {
    $title = str_replace("-", " ", $title);

    $select = "SELECT * FROM newsitems WHERE title = :title";
    $prepare = $this->_database->prepare($select);
		
    $prepare->bindParam(":title", $title, PDO::PARAM_STR);
    $prepare->execute();
		
    if($prepare->rowCount() > 0)
    {
      return $prepare->fetch();
    }
  }
}
?>

Reageren