Rozbudowujemy nasz framework MVC, router i kontrolery, zbierając wszystko do kupy, tworząc szkielet pierwotnej wersji projektu. Do dzieła.

W katalogu naszego projektu tworzymy plik home.php, gdzie będziemy trzymać klasę kontrolera:

<?php 
class Home {
    public function index(){
        require __DIR__ . "/home_index.php";
    }
}

Jak widać nazwa pliku to nazwa kontrolera (małymi literami) + „.php”.

Teraz plik product.php:

<?php 
class Product {
    public function list(){
        require __DIR__ . "/product_list.php";
    }
}

Pliki home_index.php oraz product_list.php powinniśmy mieć z poprzedniego projektu. Podobnie jak htaccess, oraz entry.php:

<?php 
class Router
{
    const SUBFOLDER = "/sometry";
    private array $routes = [];

    public function add(string $path, array $params): void
    {
        $this->routes[] = [
            "path" => $path,
            "params" => $params
        ];
    }

    public function match(string $path): array|bool
    {
        foreach ($this->routes as $route) {

            if (self::SUBFOLDER . $route["path"] === $path) {

                return $route["params"];

            }
        }

        return false;
    }
}

$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);

$router = new Router;

$router->add("/home/index", ["controller" => "home", "action" => "index"]);
$router->add("/products", ["controller" => "product", "action" => "list"]);
$router->add("/product/list", ["controller" => "product", "action" => "list"]);
$router->add("/", ["controller" => "home", "action" => "index"]);

$params = $router->match($path);

if ($params === false) {
    exit("No route matched");
}

$action = $params["action"];
$controller = $params["controller"];       
        
require __DIR__ . "/{$controller}_{$action}.php";
exit;

Teraz tutaj posprzątać trzeba:

//(...)

$action = $params["action"];
$controller = $params["controller"];
$controller_classname = ucfirst($controller);     
        
if(file_exists(__DIR__ . "/$controller.php")){
    require __DIR__ . "/$controller.php";
    if(class_exists($controller_classname)){
        $new_controller = new $controller_classname;
        if(method_exists($controller_classname, $action)){
            $new_controller->$action();
        }
    }
}

Sprawdzamy, czy dany plik (home.php, product.php) istnieje. Jeżeli tak, załączamy go i sprawdzamy, czy dana klasa (Home, Product) istnieje i tworzymy jej obiekt.

Dalej sprawdzamy, czy dana klasa posiada taką metodę (list, index). Jeżeli tak, wywołujemy tę metodę.

Trochę tu zagnieżdżenia i mało czytelnego kodu, ale działa. Poprawianiem zajmiemy się w następnej lekcji.