Ik ben bezig met het ontwikkelen van een eigen MVC. Via htaccess stuur ik alles door naar mijn index. Mijn index bepaalt vervolgens welke controller moet worden aangeroepen. Stel mijn url is /nieuws/nieuwsitem. In dit geval moet de NewsitemController worden aangeroepen om het nieuwsitem te tonen. Stel mijn URL is /over-ons. Dan moet de ContentController worden aangeroepen en een contentpagina getoond worden. Maar nu mijn vraag.. Hoe weet index welke controller moet worden aangeroepen?


// index.php
$route = explode("/", $_SERVER["REQUEST_URI"]);
>> En wat gebeurt er dan in render()?

Die include de view die jij meegeeft, waarschijnlijk met daarbij ook nog een array, waarvan je de data in de view kunt gebruiken. De view laten we dan meestal eindigen op de extensie .phtml (een combinatie van html en PHP).
Kun je eens een voorbeeldje geven hoe dat precies werkt dan?
Zoiets als dit:

<?php

// in je news controller
public function getLatest()
{
$newsitems = $this->_model->getLatest();

$this->render("nieuws.phtml", array('newsitems' => $newsitems, 'title' => 'nieuws'));
}

// in je controller
public function render($view, $data) {
extract($data);
include 'path/to/views/' . $view;
}

// in je view

echo $title;

print_r($newsitems);

?>
Goed even een starter voor je om op gang te komen.
<?php

class Route
{
private $path;
private $controller;
private $action;

function __construct($path, $controller, $action = 'index') {
$this->path = $path;
$this->controller = $controller;
$this->action = $action;
}

function getPath()
{
return $this->path;
}

function getController()
{
return $this->$controller;
}

function getAction()
{
return $this->$action;
}
}

class Dispatcher
{
private $routes;

function __construct($routes) {
$this->routes = $routes;
}

public function matchRoute($path)
{
$pathParts = explode('/', $path);

foreach($this->routes as $route)
{
if($this->compareRouteParts(explode('/', $route->getPath()), $pathParts))
return $route;
}

return NULL;
}

private function compareRouteParts($routeParts, $pathParts)
{
// als de twee arrays ongelijk zijn van lengte dan zijn de routes sowiezo niet gelijk
if(count($routeParts) != count($pathParts))
return FALSE;

// loop dan nu door alle elementen in de array's
for($i = 0 ; $i < count($routeParts) ; $i++)
{
// variabelen zijn altijd geldig
if($routeParts[$i][0] == ':')
continue;

// indien dit deel geen variabele is dan moeten de elementen dus gelijk zijn
if($pathParts[$i] != $routeParts[$i])
return FALSE;
}

return TRUE;
}
}

$routes = array(
'news' => new Route('news', 'News'),
'news_latest' => new Route('news/latest', 'News', 'latest'),
'news_show' => new Route('news/show/:id', 'News', 'show'),
);

$dispatcher = new Dispatcher($routes);

$route = $dispatcher->matchRoute('news');
if($route) {
var_dump($route); echo '<br>';
} else
echo 'ongeldige route<br>';

$route = $dispatcher->matchRoute('news/latest');
if($route) {
var_dump($route); echo '<br>';
} else
echo 'ongeldige route<br>';

$route = $dispatcher->matchRoute('news/show/12');
if($route) {
var_dump($route); echo '<br>';
} else
echo 'ongeldige route<br>';

$route = $dispatcher->matchRoute('news/pannekoek');
if($route) {
var_dump($route); echo '<br>';
} else
echo 'ongeldige route<br>';

?>
Oke, nog even terugkomend op deze discussie...
Het is even geleden, maar ik had niet eerder tijd ervoor.

Ik heb nu het volgende:

<?php
// routes.php
$routes = array();
$routes[] = array("route" => "nieuws", "controller" => "Newsitem", "action" => "index");
$routes[] = array("route" => "nieuws/{titel}", "controller" => "Newsitem", "action" => "show");

// index.php
include "includes/config.php";
include "includes/routes.php";

$request = new Request();

// Save our request
$registry = new Registry();
$registry->set("request", $request);

// En hoe dan verder?
?>


Stel mijn route is /nieuws/dit-is-een-titel.
Dan moet er dus gekeken worden welke controller hier aan gekoppeld moet worden en welke action uitgevoerd moet worden. In dit geval zou dat de show action zijn van de NewsitemController. Maar hoe bepaal ik nu welke controller moet worden aangeroepen bij welke URL?

Reageren