Phát triển Dispatcher trong MVC framework của riêng bạn

Hãy nhớ lại nội dung hiện tại của tệp index.php:

index.php<?php
  namespace Core;
  
  error_reporting(E_ALL);
  ini_set('display_errors', 'on');
  
  spl_autoload_register(function($class) {
    // triển khai autoload của bạn
  });
  
  $routes = require $_SERVER['DOCUMENT_ROOT'] . '/project/config/routes.php';
  
  $track = ( new Router ) -> getTrack($routes, $_SERVER['REQUEST_URI']);
?>

Như bạn có thể thấy, hiện tại router của chúng ta trả về đối tượng của lớp Track, chứa tên controller, tên action và các tham số từ chuỗi địa chỉ. Ngoài ra, trong bài học trước chúng ta đã tạo parent cho tất cả các controller.

Bây giờ chúng ta có thể thực hiện việc gọi phương thức của controller, dữ liệu của nó được chứa trong biến $track của chúng ta.

Việc này sẽ do một lớp đặc biệt Dispatcher đảm nhận. Dispatcher sẽ nhận đối tượng của lớp Track và theo dữ liệu của nó tạo ra đối tượng của lớp được chỉ định, gọi phương thức của lớp đó, truyền các tham số vào phương thức này.

Hãy thêm lệnh gọi dispatcher vào tệp index.php:

index.php<?php
  namespace Core;
  
  error_reporting(E_ALL);
  ini_set('display_errors', 'on');
  
  spl_autoload_register(function($class) {
    // triển khai autoload của bạn
  });
  
  $routes = require $_SERVER['DOCUMENT_ROOT'] . '/project/config/routes.php';
  
  $track = ( new Router ) -> getTrack($routes, $_SERVER['REQUEST_URI']);
  
  // Lệnh gọi dispatcher:
  $page  = ( new Dispatcher ) -> getPage($track);
?>

Việc gọi phương thức getPage của dispatcher chúng ta sẽ gọi phương thức render của controller và trả về những gì mà lệnh gọi phương thức đó trả về. Như bạn đã biết từ bài học trước, phương thức render của controller trả về đối tượng lớp Page.

Đây là bản phác thảo của lớp Dispatcher của chúng ta:

/core/Dispatcher.php<?php
  namespace Core;
  
  class Dispatcher
  {
    public function getPage(Track $track)
    {
      ...code
      return controller -> render(parameters);
    }
  }
?>
Задание 1

Sử dụng bản phác thảo của tôi, hãy triển khai lớp Dispatcher đã được mô tả. Kiểm tra hoạt động của nó. Nếu gặp khó khăn, hãy xem mã nguồn trong các tệp của framework học tập do tôi tạo.