Hướng dẫn thecodeholic php mvc core - thecodeholic php mvc core

Một thẻ đã tồn tại với tên chi nhánh được cung cấp. Nhiều lệnh GIT chấp nhận cả tên thẻ và tên chi nhánh, vì vậy việc tạo nhánh này có thể gây ra hành vi bất ngờ. Bạn có chắc là bạn muốn tạo chi nhánh này?

PHP MVC framework

Minimalistic custom framework created for educational purposes.

The framework is not well tested on production. If you use it on production you use it on your own risk.

Related core package: https://github.com/thecodeholic/tc-php-mvc-core: https://github.com/thecodeholic/tc-php-mvc-core


Installation

  1. Download the archive or clone the project using git
  2. Create database schema
  3. Create
    # index.php
    
    
    require_once('connection.php');
    
    if (isset($_GET['controller'])) {
      $controller = $_GET['controller'];
      if (isset($_GET['action'])) {
        $action = $_GET['action'];
      } else {
        $action = 'index';
      }
    } else {
      $controller = 'pages';
      $action = 'home';
    }
    require_once('routes.php');
    
    8 file from
    # index.php
    
    
    require_once('connection.php');
    
    if (isset($_GET['controller'])) {
      $controller = $_GET['controller'];
      if (isset($_GET['action'])) {
        $action = $_GET['action'];
      } else {
        $action = 'index';
      }
    } else {
      $controller = 'pages';
      $action = 'home';
    }
    require_once('routes.php');
    
    9 file and adjust database parameters (including schema name)
  4. Run
    # connection.php
    
    
    class DB
    {
        private static $instance = NULl;
        public static function getInstance() {
          if (!isset(self::$instance)) {
            try {
              self::$instance = new PDO('mysql:host=localhost;dbname=demo_mvc', 'root', '');
              self::$instance->exec("SET NAMES 'utf8'");
            } catch (PDOException $ex) {
              die($ex->getMessage());
            }
          }
          return self::$instance;
        }
    }
    
    0
  5. Run migrations by executing
    # connection.php
    
    
    class DB
    {
        private static $instance = NULl;
        public static function getInstance() {
          if (!isset(self::$instance)) {
            try {
              self::$instance = new PDO('mysql:host=localhost;dbname=demo_mvc', 'root', '');
              self::$instance->exec("SET NAMES 'utf8'");
            } catch (PDOException $ex) {
              die($ex->getMessage());
            }
          }
          return self::$instance;
        }
    }
    
    1 from the project root directory
  6. Go to the
    # connection.php
    
    
    class DB
    {
        private static $instance = NULl;
        public static function getInstance() {
          if (!isset(self::$instance)) {
            try {
              self::$instance = new PDO('mysql:host=localhost;dbname=demo_mvc', 'root', '');
              self::$instance->exec("SET NAMES 'utf8'");
            } catch (PDOException $ex) {
              die($ex->getMessage());
            }
          }
          return self::$instance;
        }
    }
    
    2 folder
  7. Start php server by running command
    # connection.php
    
    
    class DB
    {
        private static $instance = NULl;
        public static function getInstance() {
          if (!isset(self::$instance)) {
            try {
              self::$instance = new PDO('mysql:host=localhost;dbname=demo_mvc', 'root', '');
              self::$instance->exec("SET NAMES 'utf8'");
            } catch (PDOException $ex) {
              die($ex->getMessage());
            }
          }
          return self::$instance;
        }
    }
    
    3
  8. Open in browser http://127.0.0.1:8080

Installation using docker

Make sure you have docker installed. To see how you can install docker on Windows click here. Make sure

# connection.php


class DB
{
    private static $instance = NULl;
    public static function getInstance() {
      if (!isset(self::$instance)) {
        try {
          self::$instance = new PDO('mysql:host=localhost;dbname=demo_mvc', 'root', '');
          self::$instance->exec("SET NAMES 'utf8'");
        } catch (PDOException $ex) {
          die($ex->getMessage());
        }
      }
      return self::$instance;
    }
}
4 and
# connection.php


class DB
{
    private static $instance = NULl;
    public static function getInstance() {
      if (!isset(self::$instance)) {
        try {
          self::$instance = new PDO('mysql:host=localhost;dbname=demo_mvc', 'root', '');
          self::$instance->exec("SET NAMES 'utf8'");
        } catch (PDOException $ex) {
          die($ex->getMessage());
        }
      }
      return self::$instance;
    }
}
5 commands are available in command line.
Make sure
# connection.php


class DB
{
    private static $instance = NULl;
    public static function getInstance() {
      if (!isset(self::$instance)) {
        try {
          self::$instance = new PDO('mysql:host=localhost;dbname=demo_mvc', 'root', '');
          self::$instance->exec("SET NAMES 'utf8'");
        } catch (PDOException $ex) {
          die($ex->getMessage());
        }
      }
      return self::$instance;
    }
}
4 and
# connection.php


class DB
{
    private static $instance = NULl;
    public static function getInstance() {
      if (!isset(self::$instance)) {
        try {
          self::$instance = new PDO('mysql:host=localhost;dbname=demo_mvc', 'root', '');
          self::$instance->exec("SET NAMES 'utf8'");
        } catch (PDOException $ex) {
          die($ex->getMessage());
        }
      }
      return self::$instance;
    }
}
5 commands are available in command line.

  1. Clone the project using git
  2. Copy
    # index.php
    
    
    require_once('connection.php');
    
    if (isset($_GET['controller'])) {
      $controller = $_GET['controller'];
      if (isset($_GET['action'])) {
        $action = $_GET['action'];
      } else {
        $action = 'index';
      }
    } else {
      $controller = 'pages';
      $action = 'home';
    }
    require_once('routes.php');
    
    9 into
    # index.php
    
    
    require_once('connection.php');
    
    if (isset($_GET['controller'])) {
      $controller = $_GET['controller'];
      if (isset($_GET['action'])) {
        $action = $_GET['action'];
      } else {
        $action = 'index';
      }
    } else {
      $controller = 'pages';
      $action = 'home';
    }
    require_once('routes.php');
    
    8 (Don't need to change anything for local development)
  3. Navigate to the project root directory and run
    # connection.php
    
    
    class DB
    {
        private static $instance = NULl;
        public static function getInstance() {
          if (!isset(self::$instance)) {
            try {
              self::$instance = new PDO('mysql:host=localhost;dbname=demo_mvc', 'root', '');
              self::$instance->exec("SET NAMES 'utf8'");
            } catch (PDOException $ex) {
              die($ex->getMessage());
            }
          }
          return self::$instance;
        }
    }
    
    8
  4. Install dependencies -
    # connection.php
    
    
    class DB
    {
        private static $instance = NULl;
        public static function getInstance() {
          if (!isset(self::$instance)) {
            try {
              self::$instance = new PDO('mysql:host=localhost;dbname=demo_mvc', 'root', '');
              self::$instance->exec("SET NAMES 'utf8'");
            } catch (PDOException $ex) {
              die($ex->getMessage());
            }
          }
          return self::$instance;
        }
    }
    
    9
  5. Run migrations -
    # routes.php
    
    
    $controllers = array(
      'pages' => ['home', 'error']
    ); // Các controllers trong hệ thống và các action có thể gọi ra từ controller đó.
    
    // Nếu các tham số nhận được từ URL không hợp lệ (không thuộc list controller và action có thể gọi
    // thì trang báo lỗi sẽ được gọi ra.
    if (!array_key_exists($controller, $controllers) || !in_array($action, $controllers[$controller])) {
      $controller = 'pages';
      $action = 'error';
    }
    
    // Nhúng file định nghĩa controller vào để có thể dùng được class định nghĩa trong file đó
    include_once('controllers/' . $controller . '_controller.php');
    // Tạo ra tên controller class từ các giá trị lấy được từ URL sau đó gọi ra để hiển thị trả về cho người dùng.
    $klass = str_replace('_', '', ucwords($controller, '_')) . 'Controller';
    $controller = new $klass;
    $controller->$action();
    
    0
  6. Open in browser http://127.0.0.1:8080

Installation using docker

There is no license information available for the latest version (v1.0.6) of this package.

Maintainers

Details

github.com/thecodeholic/tc-php-mvc-core

Source

Issues

Installs: 2 619 2 619

Dependents: 0 0

Suggesters: 0 0

Security: 0 0

Stars: 66 66

Watchers: 7 7

Forks: 23 23

Open Issues: 6 6

v1.0.62022-04-08 18:39 UTC 2022-04-08 18:39 UTC

Requires

None

Requires (Dev)

None

Requires (Dev)

None

Requires (Dev)

None

Requires (Dev)

None

Requires (Dev)

None

Requires (Dev) 4c2447aeb5ad22a423ae61196c40415dd4b89c86

  • Suggests<>

  • Provides
  • Conflicts
  • Replaces
  • Unknown License 4c2447aeb5ad22a423ae61196c40415dd4b89c86
  • Zura Sekhniashvili
  • dev-master
  • v1.0.6
  • v1.0.5

v1.0.4

v1.0.3

1. Giới thiệu về MVC

1.1. Định nghĩa

MVC là một mô hình thiết kế, giúp bạn tổ chức code theo từng phần độc lập với nhau, và các phần tương tác với nhau theo một cách nhất định.

1.2. Cách mà mô hình hoạt động

Trình duyệt gửi một request lên server, server nhận được request sẽ phân tích và gửi dữ liệu vào controller dựa vào router điều hướng. Trong vài trường hợp thì controller sẽ render luôn ra view (một template được chuyển thành HTML) và gửi trả về cho trình duyệt. Nhưng thông thường, cho các trang web động, controller sẽ tương tác với một model (đại diện cho một phần tử ví dụ như Post, chịu trách nhiệm giao tiếp với cơ sở dữ liệu). Sau khi gọi vào model, controller sẽ render view với dữ liệu lấy được và trả kết quả về cho trình duyệt để hiển thị.

Hướng dẫn thecodeholic php mvc core - thecodeholic php mvc core

2. Xây dựng ứng dụng

2.1. Cấu trúc thư mục

|-- demo_mvc
    |-- assets
        |-- fonts
        |-- images
        |-- javascripts
        |-- stylesheets
    |-- controllers
    |-- models
    |-- views
        |-- layouts
            |-- application.php
    |-- connection.php
    |-- index.php
    |-- routes.php

Giải thích về cấu trúc thư mục trên:

  • Thư mục
    # routes.php
    
    
    $controllers = array(
      'pages' => ['home', 'error']
    ); // Các controllers trong hệ thống và các action có thể gọi ra từ controller đó.
    
    // Nếu các tham số nhận được từ URL không hợp lệ (không thuộc list controller và action có thể gọi
    // thì trang báo lỗi sẽ được gọi ra.
    if (!array_key_exists($controller, $controllers) || !in_array($action, $controllers[$controller])) {
      $controller = 'pages';
      $action = 'error';
    }
    
    // Nhúng file định nghĩa controller vào để có thể dùng được class định nghĩa trong file đó
    include_once('controllers/' . $controller . '_controller.php');
    // Tạo ra tên controller class từ các giá trị lấy được từ URL sau đó gọi ra để hiển thị trả về cho người dùng.
    $klass = str_replace('_', '', ucwords($controller, '_')) . 'Controller';
    $controller = new $klass;
    $controller->$action();
    
    1 là thư mục chứa project.
  • Thư mục
    # routes.php
    
    
    $controllers = array(
      'pages' => ['home', 'error']
    ); // Các controllers trong hệ thống và các action có thể gọi ra từ controller đó.
    
    // Nếu các tham số nhận được từ URL không hợp lệ (không thuộc list controller và action có thể gọi
    // thì trang báo lỗi sẽ được gọi ra.
    if (!array_key_exists($controller, $controllers) || !in_array($action, $controllers[$controller])) {
      $controller = 'pages';
      $action = 'error';
    }
    
    // Nhúng file định nghĩa controller vào để có thể dùng được class định nghĩa trong file đó
    include_once('controllers/' . $controller . '_controller.php');
    // Tạo ra tên controller class từ các giá trị lấy được từ URL sau đó gọi ra để hiển thị trả về cho người dùng.
    $klass = str_replace('_', '', ucwords($controller, '_')) . 'Controller';
    $controller = new $klass;
    $controller->$action();
    
    2 gồm các file font chữ, hình ảnh, javascript, css...
  • Thư mục
    # routes.php
    
    
    $controllers = array(
      'pages' => ['home', 'error']
    ); // Các controllers trong hệ thống và các action có thể gọi ra từ controller đó.
    
    // Nếu các tham số nhận được từ URL không hợp lệ (không thuộc list controller và action có thể gọi
    // thì trang báo lỗi sẽ được gọi ra.
    if (!array_key_exists($controller, $controllers) || !in_array($action, $controllers[$controller])) {
      $controller = 'pages';
      $action = 'error';
    }
    
    // Nhúng file định nghĩa controller vào để có thể dùng được class định nghĩa trong file đó
    include_once('controllers/' . $controller . '_controller.php');
    // Tạo ra tên controller class từ các giá trị lấy được từ URL sau đó gọi ra để hiển thị trả về cho người dùng.
    $klass = str_replace('_', '', ucwords($controller, '_')) . 'Controller';
    $controller = new $klass;
    $controller->$action();
    
    3 chứa các file định nghĩa các lớp controller, có các hàm trong đó tương tác với model và gọi ra view để trả về cho người dùng.
  • Thư mục
    # routes.php
    
    
    $controllers = array(
      'pages' => ['home', 'error']
    ); // Các controllers trong hệ thống và các action có thể gọi ra từ controller đó.
    
    // Nếu các tham số nhận được từ URL không hợp lệ (không thuộc list controller và action có thể gọi
    // thì trang báo lỗi sẽ được gọi ra.
    if (!array_key_exists($controller, $controllers) || !in_array($action, $controllers[$controller])) {
      $controller = 'pages';
      $action = 'error';
    }
    
    // Nhúng file định nghĩa controller vào để có thể dùng được class định nghĩa trong file đó
    include_once('controllers/' . $controller . '_controller.php');
    // Tạo ra tên controller class từ các giá trị lấy được từ URL sau đó gọi ra để hiển thị trả về cho người dùng.
    $klass = str_replace('_', '', ucwords($controller, '_')) . 'Controller';
    $controller = new $klass;
    $controller->$action();
    
    4 chứa các file định nghĩa các lớp model, chịu trách nhiệm thao tác với CSDL.
  • Thư mục
    # routes.php
    
    
    $controllers = array(
      'pages' => ['home', 'error']
    ); // Các controllers trong hệ thống và các action có thể gọi ra từ controller đó.
    
    // Nếu các tham số nhận được từ URL không hợp lệ (không thuộc list controller và action có thể gọi
    // thì trang báo lỗi sẽ được gọi ra.
    if (!array_key_exists($controller, $controllers) || !in_array($action, $controllers[$controller])) {
      $controller = 'pages';
      $action = 'error';
    }
    
    // Nhúng file định nghĩa controller vào để có thể dùng được class định nghĩa trong file đó
    include_once('controllers/' . $controller . '_controller.php');
    // Tạo ra tên controller class từ các giá trị lấy được từ URL sau đó gọi ra để hiển thị trả về cho người dùng.
    $klass = str_replace('_', '', ucwords($controller, '_')) . 'Controller';
    $controller = new $klass;
    $controller->$action();
    
    5 chứa thư mục
    # routes.php
    
    
    $controllers = array(
      'pages' => ['home', 'error']
    ); // Các controllers trong hệ thống và các action có thể gọi ra từ controller đó.
    
    // Nếu các tham số nhận được từ URL không hợp lệ (không thuộc list controller và action có thể gọi
    // thì trang báo lỗi sẽ được gọi ra.
    if (!array_key_exists($controller, $controllers) || !in_array($action, $controllers[$controller])) {
      $controller = 'pages';
      $action = 'error';
    }
    
    // Nhúng file định nghĩa controller vào để có thể dùng được class định nghĩa trong file đó
    include_once('controllers/' . $controller . '_controller.php');
    // Tạo ra tên controller class từ các giá trị lấy được từ URL sau đó gọi ra để hiển thị trả về cho người dùng.
    $klass = str_replace('_', '', ucwords($controller, '_')) . 'Controller';
    $controller = new $klass;
    $controller->$action();
    
    6 chứa template hiển thị chung của trang web trong file
    # routes.php
    
    
    $controllers = array(
      'pages' => ['home', 'error']
    ); // Các controllers trong hệ thống và các action có thể gọi ra từ controller đó.
    
    // Nếu các tham số nhận được từ URL không hợp lệ (không thuộc list controller và action có thể gọi
    // thì trang báo lỗi sẽ được gọi ra.
    if (!array_key_exists($controller, $controllers) || !in_array($action, $controllers[$controller])) {
      $controller = 'pages';
      $action = 'error';
    }
    
    // Nhúng file định nghĩa controller vào để có thể dùng được class định nghĩa trong file đó
    include_once('controllers/' . $controller . '_controller.php');
    // Tạo ra tên controller class từ các giá trị lấy được từ URL sau đó gọi ra để hiển thị trả về cho người dùng.
    $klass = str_replace('_', '', ucwords($controller, '_')) . 'Controller';
    $controller = new $klass;
    $controller->$action();
    
    7
  • Còn các file sẽ được giới thiệu rõ hơn ở các phần bên dưới.

2.2. Cơ sở dữ liệu

Trước hết, hãy tạo một cơ sở dữ liệu đơn giản có tên là demo_mvc có bảng posts với 3 trường: id (INT PRIMARY auto_increment), title (VARCHAR 255), content (TEXT) Bắt tay vào code thôi nào.demo_mvc có bảng posts với 3 trường: id (INT PRIMARY auto_increment), title (VARCHAR 255), content (TEXT) Bắt tay vào code thôi nào.

2.3. Điều hướng luồng dữ liệu

Đầu tiên, tạo file

# routes.php


$controllers = array(
  'pages' => ['home', 'error']
); // Các controllers trong hệ thống và các action có thể gọi ra từ controller đó.

// Nếu các tham số nhận được từ URL không hợp lệ (không thuộc list controller và action có thể gọi
// thì trang báo lỗi sẽ được gọi ra.
if (!array_key_exists($controller, $controllers) || !in_array($action, $controllers[$controller])) {
  $controller = 'pages';
  $action = 'error';
}

// Nhúng file định nghĩa controller vào để có thể dùng được class định nghĩa trong file đó
include_once('controllers/' . $controller . '_controller.php');
// Tạo ra tên controller class từ các giá trị lấy được từ URL sau đó gọi ra để hiển thị trả về cho người dùng.
$klass = str_replace('_', '', ucwords($controller, '_')) . 'Controller';
$controller = new $klass;
$controller->$action();
8 với nội dung như sau:

# index.php


require_once('connection.php');

if (isset($_GET['controller'])) {
  $controller = $_GET['controller'];
  if (isset($_GET['action'])) {
    $action = $_GET['action'];
  } else {
    $action = 'index';
  }
} else {
  $controller = 'pages';
  $action = 'home';
}
require_once('routes.php');

File này sẽ là file nhận mọi yêu cầu truy vấn lên server. Bởi vậy, mọi đường dẫn truy cập đều phải có dạng

# routes.php


$controllers = array(
  'pages' => ['home', 'error']
); // Các controllers trong hệ thống và các action có thể gọi ra từ controller đó.

// Nếu các tham số nhận được từ URL không hợp lệ (không thuộc list controller và action có thể gọi
// thì trang báo lỗi sẽ được gọi ra.
if (!array_key_exists($controller, $controllers) || !in_array($action, $controllers[$controller])) {
  $controller = 'pages';
  $action = 'error';
}

// Nhúng file định nghĩa controller vào để có thể dùng được class định nghĩa trong file đó
include_once('controllers/' . $controller . '_controller.php');
// Tạo ra tên controller class từ các giá trị lấy được từ URL sau đó gọi ra để hiển thị trả về cho người dùng.
$klass = str_replace('_', '', ucwords($controller, '_')) . 'Controller';
$controller = new $klass;
$controller->$action();
9 hoặc
# controllers/base_controller.php


class BaseController
{
  protected $folder; // Biến có giá trị là thư mục nào đó trong thư mục views, chứa các file view template của phần đang truy cập.

  // Hàm hiển thị kết quả ra cho người dùng.
  function render($file, $data = array())
  {
    // Kiểm tra file gọi đến có tồn tại hay không?
    $view_file = 'views/' . $this->folder . '/' . $file . '.php';
    if (is_file($view_file)) {
      // Nếu tồn tại file đó thì tạo ra các biến chứa giá trị truyền vào lúc gọi hàm
      extract($data);
      // Sau đó lưu giá trị trả về khi chạy file view template với các dữ liệu đó vào 1 biến chứ chưa hiển thị luôn ra trình duyệt
      ob_start();
      require_once($view_file);
      $content = ob_get_clean();
      // Sau khi có kết quả đã được lưu vào biến $content, gọi ra template chung của hệ thống đế hiển thị ra cho người dùng
      require_once('views/layouts/application.php');
    } else {
      // Nếu file muốn gọi ra không tồn tại thì chuyển hướng đến trang báo lỗi.
      header('Location: index.php?controller=pages&action=error');
    }
  }
}
0. Trước tiên,
# routes.php


$controllers = array(
  'pages' => ['home', 'error']
); // Các controllers trong hệ thống và các action có thể gọi ra từ controller đó.

// Nếu các tham số nhận được từ URL không hợp lệ (không thuộc list controller và action có thể gọi
// thì trang báo lỗi sẽ được gọi ra.
if (!array_key_exists($controller, $controllers) || !in_array($action, $controllers[$controller])) {
  $controller = 'pages';
  $action = 'error';
}

// Nhúng file định nghĩa controller vào để có thể dùng được class định nghĩa trong file đó
include_once('controllers/' . $controller . '_controller.php');
// Tạo ra tên controller class từ các giá trị lấy được từ URL sau đó gọi ra để hiển thị trả về cho người dùng.
$klass = str_replace('_', '', ucwords($controller, '_')) . 'Controller';
$controller = new $klass;
$controller->$action();
8 chạy nội dung trong file
# controllers/base_controller.php


class BaseController
{
  protected $folder; // Biến có giá trị là thư mục nào đó trong thư mục views, chứa các file view template của phần đang truy cập.

  // Hàm hiển thị kết quả ra cho người dùng.
  function render($file, $data = array())
  {
    // Kiểm tra file gọi đến có tồn tại hay không?
    $view_file = 'views/' . $this->folder . '/' . $file . '.php';
    if (is_file($view_file)) {
      // Nếu tồn tại file đó thì tạo ra các biến chứa giá trị truyền vào lúc gọi hàm
      extract($data);
      // Sau đó lưu giá trị trả về khi chạy file view template với các dữ liệu đó vào 1 biến chứ chưa hiển thị luôn ra trình duyệt
      ob_start();
      require_once($view_file);
      $content = ob_get_clean();
      // Sau khi có kết quả đã được lưu vào biến $content, gọi ra template chung của hệ thống đế hiển thị ra cho người dùng
      require_once('views/layouts/application.php');
    } else {
      // Nếu file muốn gọi ra không tồn tại thì chuyển hướng đến trang báo lỗi.
      header('Location: index.php?controller=pages&action=error');
    }
  }
}
2 được dùng để kết nối và truy vấn đến cơ sở dữ liệu, sử dụng PDO:

# connection.php


class DB
{
    private static $instance = NULl;
    public static function getInstance() {
      if (!isset(self::$instance)) {
        try {
          self::$instance = new PDO('mysql:host=localhost;dbname=demo_mvc', 'root', '');
          self::$instance->exec("SET NAMES 'utf8'");
        } catch (PDOException $ex) {
          die($ex->getMessage());
        }
      }
      return self::$instance;
    }
}

Bạn cần chỉnh sửa lại phần

# controllers/base_controller.php


class BaseController
{
  protected $folder; // Biến có giá trị là thư mục nào đó trong thư mục views, chứa các file view template của phần đang truy cập.

  // Hàm hiển thị kết quả ra cho người dùng.
  function render($file, $data = array())
  {
    // Kiểm tra file gọi đến có tồn tại hay không?
    $view_file = 'views/' . $this->folder . '/' . $file . '.php';
    if (is_file($view_file)) {
      // Nếu tồn tại file đó thì tạo ra các biến chứa giá trị truyền vào lúc gọi hàm
      extract($data);
      // Sau đó lưu giá trị trả về khi chạy file view template với các dữ liệu đó vào 1 biến chứ chưa hiển thị luôn ra trình duyệt
      ob_start();
      require_once($view_file);
      $content = ob_get_clean();
      // Sau khi có kết quả đã được lưu vào biến $content, gọi ra template chung của hệ thống đế hiển thị ra cho người dùng
      require_once('views/layouts/application.php');
    } else {
      // Nếu file muốn gọi ra không tồn tại thì chuyển hướng đến trang báo lỗi.
      header('Location: index.php?controller=pages&action=error');
    }
  }
}
3 sao cho trùng với thông tin kết nối tới CSDL của mình. Sau khi chạy file
# controllers/base_controller.php


class BaseController
{
  protected $folder; // Biến có giá trị là thư mục nào đó trong thư mục views, chứa các file view template của phần đang truy cập.

  // Hàm hiển thị kết quả ra cho người dùng.
  function render($file, $data = array())
  {
    // Kiểm tra file gọi đến có tồn tại hay không?
    $view_file = 'views/' . $this->folder . '/' . $file . '.php';
    if (is_file($view_file)) {
      // Nếu tồn tại file đó thì tạo ra các biến chứa giá trị truyền vào lúc gọi hàm
      extract($data);
      // Sau đó lưu giá trị trả về khi chạy file view template với các dữ liệu đó vào 1 biến chứ chưa hiển thị luôn ra trình duyệt
      ob_start();
      require_once($view_file);
      $content = ob_get_clean();
      // Sau khi có kết quả đã được lưu vào biến $content, gọi ra template chung của hệ thống đế hiển thị ra cho người dùng
      require_once('views/layouts/application.php');
    } else {
      // Nếu file muốn gọi ra không tồn tại thì chuyển hướng đến trang báo lỗi.
      header('Location: index.php?controller=pages&action=error');
    }
  }
}
2, file index.php sẽ xử lý các tham số của đường dẫn, cụ thể là lấy ra 2 tham số
# controllers/base_controller.php


class BaseController
{
  protected $folder; // Biến có giá trị là thư mục nào đó trong thư mục views, chứa các file view template của phần đang truy cập.

  // Hàm hiển thị kết quả ra cho người dùng.
  function render($file, $data = array())
  {
    // Kiểm tra file gọi đến có tồn tại hay không?
    $view_file = 'views/' . $this->folder . '/' . $file . '.php';
    if (is_file($view_file)) {
      // Nếu tồn tại file đó thì tạo ra các biến chứa giá trị truyền vào lúc gọi hàm
      extract($data);
      // Sau đó lưu giá trị trả về khi chạy file view template với các dữ liệu đó vào 1 biến chứ chưa hiển thị luôn ra trình duyệt
      ob_start();
      require_once($view_file);
      $content = ob_get_clean();
      // Sau khi có kết quả đã được lưu vào biến $content, gọi ra template chung của hệ thống đế hiển thị ra cho người dùng
      require_once('views/layouts/application.php');
    } else {
      // Nếu file muốn gọi ra không tồn tại thì chuyển hướng đến trang báo lỗi.
      header('Location: index.php?controller=pages&action=error');
    }
  }
}
5 và
# controllers/base_controller.php


class BaseController
{
  protected $folder; // Biến có giá trị là thư mục nào đó trong thư mục views, chứa các file view template của phần đang truy cập.

  // Hàm hiển thị kết quả ra cho người dùng.
  function render($file, $data = array())
  {
    // Kiểm tra file gọi đến có tồn tại hay không?
    $view_file = 'views/' . $this->folder . '/' . $file . '.php';
    if (is_file($view_file)) {
      // Nếu tồn tại file đó thì tạo ra các biến chứa giá trị truyền vào lúc gọi hàm
      extract($data);
      // Sau đó lưu giá trị trả về khi chạy file view template với các dữ liệu đó vào 1 biến chứ chưa hiển thị luôn ra trình duyệt
      ob_start();
      require_once($view_file);
      $content = ob_get_clean();
      // Sau khi có kết quả đã được lưu vào biến $content, gọi ra template chung của hệ thống đế hiển thị ra cho người dùng
      require_once('views/layouts/application.php');
    } else {
      // Nếu file muốn gọi ra không tồn tại thì chuyển hướng đến trang báo lỗi.
      header('Location: index.php?controller=pages&action=error');
    }
  }
}
6, rồi lưu giá trị của chúng vào các biến để sau này dùng cho việc quyết định sẽ làm việc gì hay hiển thị nội dung gì... Mặc định nếu không có các tham số này thì chúng sẽ được gán giá trị là controller thì trỏ đến pages, còn action thì trỏ đến home. Và đây, file
# controllers/base_controller.php


class BaseController
{
  protected $folder; // Biến có giá trị là thư mục nào đó trong thư mục views, chứa các file view template của phần đang truy cập.

  // Hàm hiển thị kết quả ra cho người dùng.
  function render($file, $data = array())
  {
    // Kiểm tra file gọi đến có tồn tại hay không?
    $view_file = 'views/' . $this->folder . '/' . $file . '.php';
    if (is_file($view_file)) {
      // Nếu tồn tại file đó thì tạo ra các biến chứa giá trị truyền vào lúc gọi hàm
      extract($data);
      // Sau đó lưu giá trị trả về khi chạy file view template với các dữ liệu đó vào 1 biến chứ chưa hiển thị luôn ra trình duyệt
      ob_start();
      require_once($view_file);
      $content = ob_get_clean();
      // Sau khi có kết quả đã được lưu vào biến $content, gọi ra template chung của hệ thống đế hiển thị ra cho người dùng
      require_once('views/layouts/application.php');
    } else {
      // Nếu file muốn gọi ra không tồn tại thì chuyển hướng đến trang báo lỗi.
      header('Location: index.php?controller=pages&action=error');
    }
  }
}
7 sẽ chịu trách nhiệm phân tích 2 biến mà chúng ta vừa lấy được ở bước trên sau đó xác định phần view nào sẽ được hiển thị.pages, còn action thì trỏ đến home. Và đây, file
# controllers/base_controller.php


class BaseController
{
  protected $folder; // Biến có giá trị là thư mục nào đó trong thư mục views, chứa các file view template của phần đang truy cập.

  // Hàm hiển thị kết quả ra cho người dùng.
  function render($file, $data = array())
  {
    // Kiểm tra file gọi đến có tồn tại hay không?
    $view_file = 'views/' . $this->folder . '/' . $file . '.php';
    if (is_file($view_file)) {
      // Nếu tồn tại file đó thì tạo ra các biến chứa giá trị truyền vào lúc gọi hàm
      extract($data);
      // Sau đó lưu giá trị trả về khi chạy file view template với các dữ liệu đó vào 1 biến chứ chưa hiển thị luôn ra trình duyệt
      ob_start();
      require_once($view_file);
      $content = ob_get_clean();
      // Sau khi có kết quả đã được lưu vào biến $content, gọi ra template chung của hệ thống đế hiển thị ra cho người dùng
      require_once('views/layouts/application.php');
    } else {
      // Nếu file muốn gọi ra không tồn tại thì chuyển hướng đến trang báo lỗi.
      header('Location: index.php?controller=pages&action=error');
    }
  }
}
7 sẽ chịu trách nhiệm phân tích 2 biến mà chúng ta vừa lấy được ở bước trên sau đó xác định phần view nào sẽ được hiển thị.

# routes.php


$controllers = array(
  'pages' => ['home', 'error']
); // Các controllers trong hệ thống và các action có thể gọi ra từ controller đó.

// Nếu các tham số nhận được từ URL không hợp lệ (không thuộc list controller và action có thể gọi
// thì trang báo lỗi sẽ được gọi ra.
if (!array_key_exists($controller, $controllers) || !in_array($action, $controllers[$controller])) {
  $controller = 'pages';
  $action = 'error';
}

// Nhúng file định nghĩa controller vào để có thể dùng được class định nghĩa trong file đó
include_once('controllers/' . $controller . '_controller.php');
// Tạo ra tên controller class từ các giá trị lấy được từ URL sau đó gọi ra để hiển thị trả về cho người dùng.
$klass = str_replace('_', '', ucwords($controller, '_')) . 'Controller';
$controller = new $klass;
$controller->$action();

2.4. Xây dựng BaseController

Mình sẽ tạo 1 lớp

# controllers/base_controller.php


class BaseController
{
  protected $folder; // Biến có giá trị là thư mục nào đó trong thư mục views, chứa các file view template của phần đang truy cập.

  // Hàm hiển thị kết quả ra cho người dùng.
  function render($file, $data = array())
  {
    // Kiểm tra file gọi đến có tồn tại hay không?
    $view_file = 'views/' . $this->folder . '/' . $file . '.php';
    if (is_file($view_file)) {
      // Nếu tồn tại file đó thì tạo ra các biến chứa giá trị truyền vào lúc gọi hàm
      extract($data);
      // Sau đó lưu giá trị trả về khi chạy file view template với các dữ liệu đó vào 1 biến chứ chưa hiển thị luôn ra trình duyệt
      ob_start();
      require_once($view_file);
      $content = ob_get_clean();
      // Sau khi có kết quả đã được lưu vào biến $content, gọi ra template chung của hệ thống đế hiển thị ra cho người dùng
      require_once('views/layouts/application.php');
    } else {
      // Nếu file muốn gọi ra không tồn tại thì chuyển hướng đến trang báo lỗi.
      header('Location: index.php?controller=pages&action=error');
    }
  }
}
8 để làm lớp cha cho các controller của hệ thống. Khi đó, mình sẽ có thể định nghĩa các hàm mà mọi controller đều có thể gọi ra mà không phải định nghĩa lại ở mỗi controller. Tạo file
# controllers/base_controller.php


class BaseController
{
  protected $folder; // Biến có giá trị là thư mục nào đó trong thư mục views, chứa các file view template của phần đang truy cập.

  // Hàm hiển thị kết quả ra cho người dùng.
  function render($file, $data = array())
  {
    // Kiểm tra file gọi đến có tồn tại hay không?
    $view_file = 'views/' . $this->folder . '/' . $file . '.php';
    if (is_file($view_file)) {
      // Nếu tồn tại file đó thì tạo ra các biến chứa giá trị truyền vào lúc gọi hàm
      extract($data);
      // Sau đó lưu giá trị trả về khi chạy file view template với các dữ liệu đó vào 1 biến chứ chưa hiển thị luôn ra trình duyệt
      ob_start();
      require_once($view_file);
      $content = ob_get_clean();
      // Sau khi có kết quả đã được lưu vào biến $content, gọi ra template chung của hệ thống đế hiển thị ra cho người dùng
      require_once('views/layouts/application.php');
    } else {
      // Nếu file muốn gọi ra không tồn tại thì chuyển hướng đến trang báo lỗi.
      header('Location: index.php?controller=pages&action=error');
    }
  }
}
9 trong thư mục
# views/layouts/application.php

<DOCTYPE html>
<html>
   <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
    <title>Demo PHP MVCtitle>
  head>
  <body>
    
  body>
html>
0:

# controllers/base_controller.php


class BaseController
{
  protected $folder; // Biến có giá trị là thư mục nào đó trong thư mục views, chứa các file view template của phần đang truy cập.

  // Hàm hiển thị kết quả ra cho người dùng.
  function render($file, $data = array())
  {
    // Kiểm tra file gọi đến có tồn tại hay không?
    $view_file = 'views/' . $this->folder . '/' . $file . '.php';
    if (is_file($view_file)) {
      // Nếu tồn tại file đó thì tạo ra các biến chứa giá trị truyền vào lúc gọi hàm
      extract($data);
      // Sau đó lưu giá trị trả về khi chạy file view template với các dữ liệu đó vào 1 biến chứ chưa hiển thị luôn ra trình duyệt
      ob_start();
      require_once($view_file);
      $content = ob_get_clean();
      // Sau khi có kết quả đã được lưu vào biến $content, gọi ra template chung của hệ thống đế hiển thị ra cho người dùng
      require_once('views/layouts/application.php');
    } else {
      // Nếu file muốn gọi ra không tồn tại thì chuyển hướng đến trang báo lỗi.
      header('Location: index.php?controller=pages&action=error');
    }
  }
}

Hãy tạo file

# routes.php


$controllers = array(
  'pages' => ['home', 'error']
); // Các controllers trong hệ thống và các action có thể gọi ra từ controller đó.

// Nếu các tham số nhận được từ URL không hợp lệ (không thuộc list controller và action có thể gọi
// thì trang báo lỗi sẽ được gọi ra.
if (!array_key_exists($controller, $controllers) || !in_array($action, $controllers[$controller])) {
  $controller = 'pages';
  $action = 'error';
}

// Nhúng file định nghĩa controller vào để có thể dùng được class định nghĩa trong file đó
include_once('controllers/' . $controller . '_controller.php');
// Tạo ra tên controller class từ các giá trị lấy được từ URL sau đó gọi ra để hiển thị trả về cho người dùng.
$klass = str_replace('_', '', ucwords($controller, '_')) . 'Controller';
$controller = new $klass;
$controller->$action();
7 trong thư mục
# views/layouts/application.php

<DOCTYPE html>
<html>
   <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
    <title>Demo PHP MVCtitle>
  head>
  <body>
    
  body>
html>
2 với nội dung như sau:

# views/layouts/application.php

<DOCTYPE html>
<html>
   <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
    <title>Demo PHP MVCtitle>
  head>
  <body>
    
  body>
html>

2.5. Xây dựng các trang tĩnh

Giờ chúng ta sẽ viết controller đầu tiên cho hệ thống, đó là

# views/layouts/application.php

<DOCTYPE html>
<html>
   <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
    <title>Demo PHP MVCtitle>
  head>
  <body>
    
  body>
html>
3, là file
# views/layouts/application.php

<DOCTYPE html>
<html>
   <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
    <title>Demo PHP MVCtitle>
  head>
  <body>
    
  body>
html>
4 được đặt trong thư mục
# views/layouts/application.php

<DOCTYPE html>
<html>
   <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
    <title>Demo PHP MVCtitle>
  head>
  <body>
    
  body>
html>
0:

# controllers/pages_controller.php


require_once('controllers/base_controller.php');

class PagesController extends BaseController
{
  function __construct()
  {
    $this->folder = 'pages';
  }

  public function home()
  {
    $data = array(
      'name' => 'Sang Beo',
      'age' => 22
    );
    $this->render('home', $data);
  }

  public function error()
  {
    $this->render('error');
  }
}

Trong thư mục

# routes.php


$controllers = array(
  'pages' => ['home', 'error']
); // Các controllers trong hệ thống và các action có thể gọi ra từ controller đó.

// Nếu các tham số nhận được từ URL không hợp lệ (không thuộc list controller và action có thể gọi
// thì trang báo lỗi sẽ được gọi ra.
if (!array_key_exists($controller, $controllers) || !in_array($action, $controllers[$controller])) {
  $controller = 'pages';
  $action = 'error';
}

// Nhúng file định nghĩa controller vào để có thể dùng được class định nghĩa trong file đó
include_once('controllers/' . $controller . '_controller.php');
// Tạo ra tên controller class từ các giá trị lấy được từ URL sau đó gọi ra để hiển thị trả về cho người dùng.
$klass = str_replace('_', '', ucwords($controller, '_')) . 'Controller';
$controller = new $klass;
$controller->$action();
5, tạo thư mục
# views/layouts/application.php

<DOCTYPE html>
<html>
   <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
    <title>Demo PHP MVCtitle>
  head>
  <body>
    
  body>
html>
7 chứa 2 file
# views/layouts/application.php

<DOCTYPE html>
<html>
   <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
    <title>Demo PHP MVCtitle>
  head>
  <body>
    
  body>
html>
8 và
# views/layouts/application.php

<DOCTYPE html>
<html>
   <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
    <title>Demo PHP MVCtitle>
  head>
  <body>
    
  body>
html>
9 với nội dung như sau:

# views/pages/home.php


  echo "Tên tôi là: $name, năm nay tôi $age tuổi";
?>
# views/pages/error.php


  echo 'Có lỗi xảy ra!';
?>

Bây giờ bạn thử truy cập đến trang

# controllers/pages_controller.php


require_once('controllers/base_controller.php');

class PagesController extends BaseController
{
  function __construct()
  {
    $this->folder = 'pages';
  }

  public function home()
  {
    $data = array(
      'name' => 'Sang Beo',
      'age' => 22
    );
    $this->render('home', $data);
  }

  public function error()
  {
    $this->render('error');
  }
}
0 hoặc trang
# controllers/pages_controller.php


require_once('controllers/base_controller.php');

class PagesController extends BaseController
{
  function __construct()
  {
    $this->folder = 'pages';
  }

  public function home()
  {
    $data = array(
      'name' => 'Sang Beo',
      'age' => 22
    );
    $this->render('home', $data);
  }

  public function error()
  {
    $this->render('error');
  }
}
1 để xem kết quả
Hướng dẫn thecodeholic php mvc core - thecodeholic php mvc core

2.6. Xây dựng module Post

2.6.1. Hiển thị tất cả bài viết

Tạo file

# controllers/pages_controller.php


require_once('controllers/base_controller.php');

class PagesController extends BaseController
{
  function __construct()
  {
    $this->folder = 'pages';
  }

  public function home()
  {
    $data = array(
      'name' => 'Sang Beo',
      'age' => 22
    );
    $this->render('home', $data);
  }

  public function error()
  {
    $this->render('error');
  }
}
2 trong thư mục
# routes.php


$controllers = array(
  'pages' => ['home', 'error']
); // Các controllers trong hệ thống và các action có thể gọi ra từ controller đó.

// Nếu các tham số nhận được từ URL không hợp lệ (không thuộc list controller và action có thể gọi
// thì trang báo lỗi sẽ được gọi ra.
if (!array_key_exists($controller, $controllers) || !in_array($action, $controllers[$controller])) {
  $controller = 'pages';
  $action = 'error';
}

// Nhúng file định nghĩa controller vào để có thể dùng được class định nghĩa trong file đó
include_once('controllers/' . $controller . '_controller.php');
// Tạo ra tên controller class từ các giá trị lấy được từ URL sau đó gọi ra để hiển thị trả về cho người dùng.
$klass = str_replace('_', '', ucwords($controller, '_')) . 'Controller';
$controller = new $klass;
$controller->$action();
4:

# models/post.php


class Post
{
  public $id;
  public $title;
  public $content;

  function __construct($id, $title, $content)
  {
    $this->id = $id;
    $this->title = $title;
    $this->content = $content;
  }

  static function all()
  {
    $list = [];
    $db = DB::getInstance();
    $req = $db->query('SELECT * FROM posts');

    foreach ($req->fetchAll() as $item) {
      $list[] = new Post($item['id'], $item['title'], $item['content']);
    }

    return $list;
  }
}

Tạo file

# controllers/pages_controller.php


require_once('controllers/base_controller.php');

class PagesController extends BaseController
{
  function __construct()
  {
    $this->folder = 'pages';
  }

  public function home()
  {
    $data = array(
      'name' => 'Sang Beo',
      'age' => 22
    );
    $this->render('home', $data);
  }

  public function error()
  {
    $this->render('error');
  }
}
4 trong thư mục
# views/layouts/application.php

<DOCTYPE html>
<html>
   <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
    <title>Demo PHP MVCtitle>
  head>
  <body>
    
  body>
html>
0

# index.php


require_once('connection.php');

if (isset($_GET['controller'])) {
  $controller = $_GET['controller'];
  if (isset($_GET['action'])) {
    $action = $_GET['action'];
  } else {
    $action = 'index';
  }
} else {
  $controller = 'pages';
  $action = 'home';
}
require_once('routes.php');
0

Tạo thư mục

# controllers/pages_controller.php


require_once('controllers/base_controller.php');

class PagesController extends BaseController
{
  function __construct()
  {
    $this->folder = 'pages';
  }

  public function home()
  {
    $data = array(
      'name' => 'Sang Beo',
      'age' => 22
    );
    $this->render('home', $data);
  }

  public function error()
  {
    $this->render('error');
  }
}
6 trong thư mục
# routes.php


$controllers = array(
  'pages' => ['home', 'error']
); // Các controllers trong hệ thống và các action có thể gọi ra từ controller đó.

// Nếu các tham số nhận được từ URL không hợp lệ (không thuộc list controller và action có thể gọi
// thì trang báo lỗi sẽ được gọi ra.
if (!array_key_exists($controller, $controllers) || !in_array($action, $controllers[$controller])) {
  $controller = 'pages';
  $action = 'error';
}

// Nhúng file định nghĩa controller vào để có thể dùng được class định nghĩa trong file đó
include_once('controllers/' . $controller . '_controller.php');
// Tạo ra tên controller class từ các giá trị lấy được từ URL sau đó gọi ra để hiển thị trả về cho người dùng.
$klass = str_replace('_', '', ucwords($controller, '_')) . 'Controller';
$controller = new $klass;
$controller->$action();
5, sau đó tạo file
# routes.php


$controllers = array(
  'pages' => ['home', 'error']
); // Các controllers trong hệ thống và các action có thể gọi ra từ controller đó.

// Nếu các tham số nhận được từ URL không hợp lệ (không thuộc list controller và action có thể gọi
// thì trang báo lỗi sẽ được gọi ra.
if (!array_key_exists($controller, $controllers) || !in_array($action, $controllers[$controller])) {
  $controller = 'pages';
  $action = 'error';
}

// Nhúng file định nghĩa controller vào để có thể dùng được class định nghĩa trong file đó
include_once('controllers/' . $controller . '_controller.php');
// Tạo ra tên controller class từ các giá trị lấy được từ URL sau đó gọi ra để hiển thị trả về cho người dùng.
$klass = str_replace('_', '', ucwords($controller, '_')) . 'Controller';
$controller = new $klass;
$controller->$action();
8 với nội dung:

# index.php


require_once('connection.php');

if (isset($_GET['controller'])) {
  $controller = $_GET['controller'];
  if (isset($_GET['action'])) {
    $action = $_GET['action'];
  } else {
    $action = 'index';
  }
} else {
  $controller = 'pages';
  $action = 'home';
}
require_once('routes.php');
1

Giờ nếu truy cập vào

# controllers/pages_controller.php


require_once('controllers/base_controller.php');

class PagesController extends BaseController
{
  function __construct()
  {
    $this->folder = 'pages';
  }

  public function home()
  {
    $data = array(
      'name' => 'Sang Beo',
      'age' => 22
    );
    $this->render('home', $data);
  }

  public function error()
  {
    $this->render('error');
  }
}
9 thì nó sẽ ra trang báo lỗi. Cần phải làm 1 bước nữa là bổ sung controller
# controllers/pages_controller.php


require_once('controllers/base_controller.php');

class PagesController extends BaseController
{
  function __construct()
  {
    $this->folder = 'pages';
  }

  public function home()
  {
    $data = array(
      'name' => 'Sang Beo',
      'age' => 22
    );
    $this->render('home', $data);
  }

  public function error()
  {
    $this->render('error');
  }
}
6 và các action được gọi ra vào file
# views/pages/home.php


  echo "Tên tôi là: $name, năm nay tôi $age tuổi";
?>
1:

# index.php


require_once('connection.php');

if (isset($_GET['controller'])) {
  $controller = $_GET['controller'];
  if (isset($_GET['action'])) {
    $action = $_GET['action'];
  } else {
    $action = 'index';
  }
} else {
  $controller = 'pages';
  $action = 'home';
}
require_once('routes.php');
2

Và giờ bạn vào db tạo một số dữ liệu mẫu và truy cập thử trang

# controllers/pages_controller.php


require_once('controllers/base_controller.php');

class PagesController extends BaseController
{
  function __construct()
  {
    $this->folder = 'pages';
  }

  public function home()
  {
    $data = array(
      'name' => 'Sang Beo',
      'age' => 22
    );
    $this->render('home', $data);
  }

  public function error()
  {
    $this->render('error');
  }
}
9
Hướng dẫn thecodeholic php mvc core - thecodeholic php mvc core

2.6.2. Hiển thị nội dung một bài viết

Cập nhật model Post bổ sung thêm hàm

# views/pages/home.php


  echo "Tên tôi là: $name, năm nay tôi $age tuổi";
?>
3

# index.php


require_once('connection.php');

if (isset($_GET['controller'])) {
  $controller = $_GET['controller'];
  if (isset($_GET['action'])) {
    $action = $_GET['action'];
  } else {
    $action = 'index';
  }
} else {
  $controller = 'pages';
  $action = 'home';
}
require_once('routes.php');
3

Thêm action

# views/pages/home.php


  echo "Tên tôi là: $name, năm nay tôi $age tuổi";
?>
4 vào
# views/pages/home.php


  echo "Tên tôi là: $name, năm nay tôi $age tuổi";
?>
5:

# index.php


require_once('connection.php');

if (isset($_GET['controller'])) {
  $controller = $_GET['controller'];
  if (isset($_GET['action'])) {
    $action = $_GET['action'];
  } else {
    $action = 'index';
  }
} else {
  $controller = 'pages';
  $action = 'home';
}
require_once('routes.php');
4

Tạo view cho show Post: Tạo file show.php trong thư mục

# views/pages/home.php


  echo "Tên tôi là: $name, năm nay tôi $age tuổi";
?>
6

# index.php


require_once('connection.php');

if (isset($_GET['controller'])) {
  $controller = $_GET['controller'];
  if (isset($_GET['action'])) {
    $action = $_GET['action'];
  } else {
    $action = 'index';
  }
} else {
  $controller = 'pages';
  $action = 'home';
}
require_once('routes.php');
5

Bổ sung thêm action

# views/pages/home.php


  echo "Tên tôi là: $name, năm nay tôi $age tuổi";
?>
4 vào controller posts trong
# views/pages/home.php


  echo "Tên tôi là: $name, năm nay tôi $age tuổi";
?>
1:

# index.php


require_once('connection.php');

if (isset($_GET['controller'])) {
  $controller = $_GET['controller'];
  if (isset($_GET['action'])) {
    $action = $_GET['action'];
  } else {
    $action = 'index';
  }
} else {
  $controller = 'pages';
  $action = 'home';
}
require_once('routes.php');
6

Cập nhật link ở trang index, trỏ đến trang show post:

# index.php


require_once('connection.php');

if (isset($_GET['controller'])) {
  $controller = $_GET['controller'];
  if (isset($_GET['action'])) {
    $action = $_GET['action'];
  } else {
    $action = 'index';
  }
} else {
  $controller = 'pages';
  $action = 'home';
}
require_once('routes.php');
7

Và bây giờ truy cập thử 1 link:

# views/pages/home.php


  echo "Tên tôi là: $name, năm nay tôi $age tuổi";
?>
9
Hướng dẫn thecodeholic php mvc core - thecodeholic php mvc core

3. Tổng kết

Trên đây là hướng dẫn tạo một ứng dụng PHP thuần sử dụng mô hình MVC dựa trên sự hiểu biết của mình. Bạn có thể áp dụng tư tưởng trên để tiếp tục tự làm thử phần sửa nội dung bài viết, hay xoá bài viết... Nếu có gì góp ý hay thắc mắc, hãy comment phía dưới nhé. Mọi ý kiến đều được hoan nghênh ạ! Cảm ơn vì đã quan tâm đến bài viết.