A 3.6.2 fejezet egyszerűbb megoldása után nézzünk a Front controller tervezési mintáról is egy korszerűbb, objektumorientált megoldást. Jelen fejezet példája Chris Corbyn A lightweight and flexible front controller for PHP 5 cikkéből származik.

Példaként egy egyszerű vendégkönyv jellegű alkalmazást fogunk megismerni.

index.php

Objektumorientált megközelítésben a Front controller általában egy osztály szokott lenni. Ez az osztály végzi a teljes vezérlést. Az index.php tulajdonképpen csak ennek előkészítésére szolgál, hosszabb kódot nem szokott tartalmazni:

<?php
  define
("PAGE_DIR", dirname(__FILE__) . "/pages");
  require_once
"FrontController.php";
 
FrontController::createInstance()->dispatch();
?>

FrontController.php

A FrontController osztály példányosítása nem a szokásos módon, az osztályon kívül, hanem egy gyártó metódussal (createInstance) valósul meg.

<?php
class FrontController {
  public static function createInstance() {
    if (!defined("PAGE_DIR")) {
      exit("Critical error: Cannot proceed without PAGE_DIR.");
    }
    $instance = new self();
    return $instance;
  }

A dispatch függvény adja az osztály tényleges logikáját. Először is jól látszik, hogy a get paraméterek között page és action értékekre számít. Az alapértelmezett page érték home lesz, az alapértelmezett action pedig index.

<?php
 
public function dispatch() {
   
$page = !empty($_GET["page"]) ? $_GET["page"] : "home";
   
$action = !empty($_GET["action"]) ? $_GET["action"] : "index";
?>

Összeállítja a $page paraméter alapján a betöltendő osztály nevét. A kezdőbetűt nagybetűsíti az objektumorientált konvencióknak megfelelően.

<?php
    $class
= ucfirst($page) . "Actions";
?>

Összeállítja a $file változóba a betöltendő állománynevet (pl. pages/home/HomeActions.php), majd megnyitja.

<?php
    $file
= PAGE_DIR . "/" . $page . "/" . $class . ".php";
    if (!
is_file($file)) {
      exit(
"Page not found");
    }
    require_once
$file;
?>

Szintén a paraméterek alapján áll össze a meghívandó metódus neve. Ha létezik, meghívjuk (pl. $controller->doIndex()), és ezzel az osztály befejezte működését.

<?php
    $actionMethod
= "do" . ucfirst($action);
   
$controller = new $class();
    if (!
method_exists($controller, $actionMethod)) {
      exit(
"Page not found");
    }
   
$controller->$actionMethod();
    exit(
0);
  }
}
?>

pages/guestbook/GuestbookActions.php

Példaként nézzük a vendégkönyv funkcionalitást megvalósító kód vázlatát.

<?php
class GuestbookActions {
  public function doIndex() {
    // index (listázás) megvalósítás
  }
  public function doCreatePost() {
    // bejegyzés létrehozása megvalósítás
  }
}

Nézzünk 1-1 példát a két akció meghívására: