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.