Bộ xương php mvc

Khung khung PHP MVC nhỏ, đơn giản, gói gọn rất nhiều tính năng được bao quanh bởi các lớp bảo mật mạnh mẽ

php framework mvc php-framework mvc-framework php-mvc-skeleton

  • Cập nhật 19/11/2020
  • PHP

ahegazy / php-mvc-skeleton

Sao 46

  • Mã số
  • Vấn đề
  • Yêu cầu kéo

Khung ứng dụng web PHP OOP sử dụng mẫu kiến ​​trúc MVC để tạo ứng dụng cơ bản chứa hệ thống đăng nhập và đa ngôn ngữ và có thể được sử dụng trong bất kỳ dự án web nào

ví dụ đăng nhập php mvc skeleton oop webapp mvc-pattern htaccess php-mvc-skeleton đa ngôn ngữ hệ thống đa ngôn ngữ php-skeleton

  • Cập nhật16/03/2020
  • PHP

apphp / directy-cmf

Sao 6

  • Mã số
  • Vấn đề
  • Yêu cầu kéo

Khung quản lý nội dung PHP - ứng dụng web đa mục đích với Bảng quản trị dựng sẵn, dựa trên MVC Framework

php mvc-framework php-mvc-framework cmf php-mvc-skeleton php-mvc-ứng dụng

  • Cập nhật ngày 20 tháng 1 năm 2023
  • PHP

goncalo goncalves / esqueleto

Sao 2

  • Mã số
  • Vấn đề
  • Yêu cầu kéo

Khung PHP MVC

php php-mvc-skeleton esqueleto

  • Cập nhật 30 tháng 4 năm 2018
  • PHP

thangl3 / slem-starter

Sao 1

  • Mã số
  • Vấn đề
  • Yêu cầu kéo

Cấu trúc khởi tạo mẫu cho Slim 3. x framework (xây dựng theo kiến ​​trúc MVC)

api php mẫu soạn sẵn mvc-architecture slim-framework php-mvc-skeleton php-boilerplate

  • Cập nhật ngày 16 tháng 1 năm 2019
  • PHP

rizky / camagru

Sao 1

  • Mã số
  • Vấn đề
  • Yêu cầu kéo

📸Ứng dụng web chia sẻ ảnh, được phát triển với khung vi mô PHP nội bộ;

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 yêu cầu lên máy chủ, máy chủ nhận được yêu cầu sẽ phân tích và gửi dữ liệu đến bộ điều khiển dựa trên điều hướng của bộ định tuyến. Trong vài trường hợp, bộ điều khiển sẽ hiển thị luôn ra chế độ xem (một mẫu được chuyển thành HTML) và gửi trả về cho trình duyệt. Nhưng thông thường, đối với các trang web động, bộ điều khiển sẽ tương tác với một mô hình (đạ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 mô hình, bộ điều khiển sẽ hiển thị chế độ xem với dữ liệu được lấy và kết quả trả về cho trình duyệt để hiển thị.

Bộ xương php mvc

2. Build application

2. 1. Constructor directory

|-- 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 cấu trúc

  • Thư mục
    # routes.php
    
    <?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 là thư mục chứa dự án
  • Thư mục
    # routes.php
    
    <?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 bao gồm các file font chữ, hình ảnh, javascript, css
  • Thư mục
    # routes.php
    
    <?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ứa các tệp định nghĩa các lớp điều khiển, có các hàm trong đó tương tác với mô hình và gọi ra chế độ xem để trả về cho người dùng
  • Thư mục
    # routes.php
    
    <?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 chứa các tệp định nghĩa các mô hình lớp, chịu trách nhiệm thao tác với cơ sở dữ liệu
  • Thư mục
    # controllers/base_controller.php
    
    <?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 chứa thư mục
    # controllers/base_controller.php
    
    <?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');
        }
      }
    }
    
    1 chứa mẫu hiển thị chung của trang web trong tệp
    # controllers/base_controller.php
    
    <?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ác tập tin còn lại sẽ được giới thiệu rõ ràng 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 bài viết 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 tệp

# controllers/base_controller.php

<?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 với nội dung như sau

# index.php

<?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');

Tệp này sẽ là tệp nhận mọi yêu cầu truy vấn lên máy chủ. Bởi vậy, mọi đường dẫn truy cập đều phải có dạng

# controllers/base_controller.php

<?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');
    }
  }
}
4 hoặc
# controllers/base_controller.php

<?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. Trước tiên,
# controllers/base_controller.php

<?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 chạy nội dung trong tệp
# controllers/base_controller.php

<?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 được sử dụng để kết nối và truy vấn đến cơ sở dữ liệu, sử dụng PDO

# connection.php

<?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

<?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 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

<?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, file index. php sẽ xử lý các tham số của đường dẫn, cụ thể là có thể lấy ra 2 tham số
# 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 MVC</title>
  </head>
  <body>
    <?= @$content ?>
  </body>
</html>
0 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 MVC</title>
  </head>
  <body>
    <?= @$content ?>
  </body>
</html>
1, sau đó lưu giá trị của chúng vào các biến để sau này sử dụng cho việc quyết định sẽ làm việc gì hay hiển thị nội dung gì. Default if does not have this tham số thì chúng ta sẽ được gán giá trị là bộ điều khiển thì trỏ đến trang, còn hành động thì trỏ đến trang chủ. Và đây, tệp
# 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 MVC</title>
  </head>
  <body>
    <?= @$content ?>
  </body>
</html>
2 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 xem phần nào sẽ được hiển thị

# routes.php

<?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

# 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 MVC</title>
  </head>
  <body>
    <?= @$content ?>
  </body>
</html>
3 để làm lớp cha cho các bộ điều khiển của hệ thống. Khi đó, mình sẽ có thể định nghĩa các hàm mà mọi bộ điều khiển đều có thể gọi ra mà không thể định nghĩa lại ở mỗi bộ điều khiển. Create 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 MVC</title>
  </head>
  <body>
    <?= @$content ?>
  </body>
</html>
4 in directory
# 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 MVC</title>
  </head>
  <body>
    <?= @$content ?>
  </body>
</html>
5

# controllers/base_controller.php

<?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');
    }
  }
}

Please create file

# controllers/base_controller.php

<?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 in directory
# 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 MVC</title>
  </head>
  <body>
    <?= @$content ?>
  </body>
</html>
7 with the content as after

# 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 MVC</title>
  </head>
  <body>
    <?= @$content ?>
  </body>
</html>

2. 5. Build tĩnh trang

Giờ chúng ta sẽ viết bộ điều khiển đầ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 MVC</title>
  </head>
  <body>
    <?= @$content ?>
  </body>
</html>
8, là tệp
# 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 MVC</title>
  </head>
  <body>
    <?= @$content ?>
  </body>
</html>
9 đượ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 MVC</title>
  </head>
  <body>
    <?= @$content ?>
  </body>
</html>
5

# controllers/pages_controller.php

<?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

# controllers/base_controller.php

<?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, tạo thư mục
# controllers/pages_controller.php

<?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 bao gồm 2 tệp
# controllers/pages_controller.php

<?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');
  }
}
3 và
# controllers/pages_controller.php

<?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 với nội dung như sau

# views/pages/home.php

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

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

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

# controllers/pages_controller.php

<?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');
  }
}
5 hoặc trang
# controllers/pages_controller.php

<?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 để xem kết quả
Bộ xương php mvc

2. 6. Xây dựng module Post

2. 6. 1. Hiển thị tất cả các bài viết

Create file

# controllers/pages_controller.php

<?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');
  }
}
7 in directory
# routes.php

<?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

# models/post.php

<?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;
  }
}

Create file

# controllers/pages_controller.php

<?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 in directory
# 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 MVC</title>
  </head>
  <body>
    <?= @$content ?>
  </body>
</html>
5

# index.php

<?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

# views/pages/home.php

<?php
  echo "Tên tôi là: $name, năm nay tôi $age tuổi";
?>
1 trong thư mục
# controllers/base_controller.php

<?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, sau đó tạo tệp
# controllers/base_controller.php

<?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 với nội dung

# index.php

<?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

# views/pages/home.php

<?php
  echo "Tên tôi là: $name, năm nay tôi $age tuổi";
?>
4 thì nó sẽ ra trang báo lỗi. Cần phải làm 1 bước nữa là bộ điều khiển bổ sung
# views/pages/home.php

<?php
  echo "Tên tôi là: $name, năm nay tôi $age tuổi";
?>
1 và các hành động được gọi ra vào tệp
# views/pages/home.php

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

# index.php

<?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

# views/pages/home.php

<?php
  echo "Tên tôi là: $name, năm nay tôi $age tuổi";
?>
4
Bộ xương php mvc

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

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

# views/pages/home.php

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

# index.php

<?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 hành động

# views/pages/home.php

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

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

# index.php

<?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

Create view for show Post. Tạo tệp hiển thị. php in the directory

# views/pages/error.php

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

# index.php

<?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 hành động

# views/pages/home.php

<?php
  echo "Tên tôi là: $name, năm nay tôi $age tuổi";
?>
9 vào các bài đăng của bộ điều khiển trong
# views/pages/home.php

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

# index.php

<?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 liên kết ở trang index, trỏ đến trang hiển thị bài viết

# index.php

<?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

And now access to try 1 link.

# views/pages/error.php

<?php
  echo 'Có lỗi xảy ra!';
?>
4
Bộ xương php mvc

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 trí tưởng tượng để tiếp tục tự làm thử phần sửa đổi nội dung bài viết, hay xóa bài viết. Nếu có gì đóng góp ý kiến ​​hay thắc mắc, hãy comment phía bên dưới nhé. Mọi người kiến ​​nghị đều hoan hỉ ạ. Cảm ơn vì đã quan tâm đến bài viết