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
ahegazy / php-mvc-skeletonSao 46 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
apphp / directy-cmfSao 6 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 / esqueletoSao 2 Khung PHP MVC php php-mvc-skeleton esqueleto - Cập nhật 30 tháng 4 năm 2018
- PHP
thangl3 / slem-starterSao 1 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 / camagruSao 1 📸Ứ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 độngTrì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ị. 2. Build application2. 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ệuTrướ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 BaseControllerMì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 trangGiờ 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ả2. 6. Xây dựng module Post2. 6. 1. Hiển thị tất cả các bài viếtCreate 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');
0Tạ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');
1Giờ 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');
2Và 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";
?>
42. 6. 2. Hiển thị nội dung một bài viếtCậ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');
3Thê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');
4Create 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');
5Bổ 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');
6Cậ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');
7And now access to try 1 link. # views/pages/error.php
<?php
echo 'Có lỗi xảy ra!';
?>
43. Tổng kếtTrê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 |