搭建自己的PHP MVC框架详解

搭建自己的 PHP MVC 框架非常有意义,它不仅可以让我们更好地理解 MVC 设计模式,还可以帮助我们更好地学习和掌握 PHP 技术栈。下面,我将详细讲解如何搭建自己的 PHP MVC 框架,包括以下步骤。

一、搭建框架目录结构

首先,我们需要搭建一个合适的目录结构。建议按照 MVC 设计模式的要求,将代码分为 Model、View 和 Controller 三个部分,同时还包括公共库和配置文件等内容。具体的目录结构如下:

app
|-- config
|   |-- config.php
|-- controller
|   |-- IndexController.php
|-- model
|   |-- UserModel.php
|-- view
|   |-- index
|   |   |-- index.php
|   |-- layout
|   |   |-- header.php
|   |   |-- footer.php
|-- system
|   |-- core.php
|   |-- router.php
|-- index.php

目录结构比较简单,主要包括配置、控制器、模型、视图、系统核心和路由等内容,其中控制器、模型和视图都是按照功能、模块或页面等进行分类,可根据实际情况进行调整。

二、编写系统配置文件

在 app/config 目录下,我们需要编写系统配置文件 config.php,包括数据库配置、常量定义、时区设置和错误提示信息等内容。可以参考以下代码:

<?php

define('BASE_URL', '/');
define('DB_HOST', 'localhost');
define('DB_NAME', 'test');
define('DB_USER', 'root');
define('DB_PASS', '');
define('DEFAULT_CONTROLLER', 'index');
define('DEFAULT_ACTION', 'index');
define('ERROR_REPORTING', E_ALL);
define('TIMEZONE', 'Asia/Shanghai');

date_default_timezone_set(TIMEZONE);
error_reporting(ERROR_REPORTING);

系统配置文件主要定义了一些常量,如数据库的连接参数、URL 的基础路径、默认的控制器和动作名称、时区设置和错误提示信息等。这些参数可以根据实际情况进行调整。

三、编写系统核心文件

在 app/system 目录下,我们需要编写系统核心文件 core.php,用于处理框架的初始化、路由解析、控制器和动作的执行,还包括模型和视图的加载等功能。可以参考以下代码:

<?php

class Core {

    public function __construct() {
        $this->_init();
        $this->_autoload();
        $this->_router();
        $this->_dispatch();
    }

    protected function _init() {}

    protected function _autoload() {
        spl_autoload_register(function($className) {
            $classFile = str_replace('\\', DIRECTORY_SEPARATOR, $className) . '.php';
            $classPath = APP_PATH . DIRECTORY_SEPARATOR . $classFile;
            if (file_exists($classPath)) {
                require_once $classPath;
            }
        });
    }

    protected function _router() {
        $path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
        $path = rtrim(str_replace(BASE_URL, '', $path), '/');

        $routes = explode('/', $path);
        $this->controller = isset($routes[0]) && $routes[0] ? $routes[0] : DEFAULT_CONTROLLER;
        $this->action = isset($routes[1]) && $routes[1] ? $routes[1] : DEFAULT_ACTION;
        $this->params = array_slice($routes, 2);
    }

    protected function _dispatch() {
        $controllerName = ucfirst($this->controller) . 'Controller';
        $actionName = strtolower($this->action) . 'Action';

        if (!class_exists($controllerName)) {
            die('Controller not found: ' . $controllerName);
        }
        $controller = new $controllerName;

        if (!method_exists($controller, $actionName)) {
            die('Action not found: ' . $actionName);
        }

        call_user_func_array([$controller, $actionName], $this->params);
    }
}

系统核心文件主要包括以下功能:

  • 初始化:执行一些系统初始化操作;
  • 自动加载:使用 spl_autoload_register 函数注册自动加载器,实现类的自动加载;
  • 路由解析:解析当前请求的 URL,获取控制器和动作名称;
  • 分发处理:根据解析的结果实例化控制器,并调用相应的动作方法执行,同时将 URL 中的参数传递给动作方法;

四、编写路由文件

在 app/system 目录下,还需要编写路由文件 router.php,用于对路由进行更加细粒度的处理,可以根据项目需要进行选择。参考以下示例代码:

$router = new Router();

$router->add('/:controller/:action', function($controller, $action) {
    return ['controller' => $controller, 'action' => $action];
});

$router->add('/:controller/:action/:id', function($controller, $action, $id) {
    return ['controller' => $controller, 'action' => $action, 'id' => $id];
});

return $router;

路由文件主要通过自定义的路由规则对请求进行匹配,并返回相应的参数数组,如 '/:controller/:action' 表示将 URL 中的第一个和第二个参数作为控制器和动作名称,'/controller/action/id' 表示将 URL 中的前三个参数作为控制器、动作和 ID,个数不限。路由启用的方法可以在系统核心文件 core.php 中的 _router() 方法中调用,在需要时进行调整。

五、编写控制器、模型和视图

在 app/controller、app/model 和 app/view 目录下,我们需要分别编写控制器、模型和视图文件,具体可以根据实际需求进行调整。以下是一个简单的示例控制器 IndexController 的代码:

<?php

class IndexController {

    public function indexAction() {
        $userModel = new UserModel();
        $users = $userModel->findAll();
        include APP_PATH . '/view/index/index.php';
    }

}

在控制器中,我们可以调用模型的方法获取数据,再将数据传递给视图进行渲染。以下是一个简单的示例模型 UserModel 的代码:

<?php

class UserModel {

    public function __construct() {
        $dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=utf8mb4';
        $this->_pdo = new PDO($dsn, DB_USER, DB_PASS);
    }

    public function findAll() {
        $stmt = $this->_pdo->query('SELECT * FROM `user`');
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }

}

在模型中,我们可以使用 PDO 连接数据库,并实现一些常用的数据查询和操作方法。以下是一个简单的示例视图 app/view/index/index.php 的代码:

<?php
include APP_PATH . '/view/layout/header.php';
?>

<ul>
<?php foreach ($users as $user): ?>
    <li>#<?php echo $user['id']; ?> <?php echo $user['name']; ?></li>
<?php endforeach; ?>
</ul>

<?php
include APP_PATH . '/view/layout/footer.php';

在视图中,我们可以使用 PHP 将数据进行渲染并输出 HTML 页面,还可以包含其他的布局文件和公共模板等内容。

六、编写入口文件

最后,在 app 目录下我们需要编写一个入口文件 index.php,用于启动整个框架,将请求分发到系统核心文件 core.php 中进行处理。以下是一个简单的示例代码:

<?php

define('APP_PATH', realpath(__DIR__));
define('BASE_URL', '/');
require_once APP_PATH . '/config/config.php';
require_once APP_PATH . '/system/core.php';

new Core();

入口文件主要包括以下内容:

  • 定义 APP_PATH 常量,指定当前应用的根目录;
  • 定义 BASE_URL 常量,用于指定网站的基础路径;
  • 引入系统配置文件 config.php;
  • 引入系统核心文件 core.php;
  • 实例化 Core 类,启动框架;

基本上,我们的 PHP MVC 框架就搭建完毕了。我们可以通过访问 URL 来测试各个部分的功能,如 http://localhost:8080/index/index/index 等。如果有特殊需求,我们还可以根据实际情况对框架进行调整和扩展。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:搭建自己的PHP MVC框架详解 - Python技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • Docker使用Git实现Jenkins发布、测试项目的详细流程

    下面我来详细讲解一下使用Docker、Git和Jenkins进行项目发布和测试的完整攻略。 概述 使用Docker、Git和Jenkins进行项目发布和测试的流程可以概括为以下几步: 编写项目代码并提交到Git仓库; 配置Jenkins服务器,包括安装Docker、配置Jenkins插件和设置Jenkins Job; 使用Jenkins Job拉取项目代码、…

    database 2023年5月22日
    00
  • redis集群命令及常规操作

    集群命令 –cluster-search-multiple-owners   [root@redis06 etc]# redis-cli –cluster help Cluster Manager Commands: create host1:port1 … hostN:portN # 创建集群 –cluster-replicas <arg&…

    Redis 2023年4月13日
    00
  • MySQL系列教程之使用C语言来连接数据库

    针对“MySQL系列教程之使用C语言来连接数据库”的完整攻略,我来为你详细解答。 确认环境 首先需要确认本地环境是否已经安装了MySQL数据库和C语言的开发环境,如果没有安装可以先进行安装,安装方法可以自行搜索。 安装MySQL C API 接下来需要安装MySQL C API,可以从MySQL官方网站下载安装包。下载地址:https://dev.mysql…

    database 2023年5月22日
    00
  • Python 基于Python从mysql表读取千万数据实践

    基于Python 从mysql表读取千万数据实践   by:授客 QQ:1033553122 场景:   有以下两个表,两者都有一个表字段,名为waybill_no,我们需要从tl_waybill_bar_record表读取1000w条唯一的waybill_no,然后作为INSERT SQL语句的一部分,填充到ts_order_waybill的waybill…

    MySQL 2023年4月13日
    00
  • MySQL临时表的简单用法介绍

    MySQL临时表的简单用法介绍 MySQL临时表是一种只在当前会话(session)或者当前连接(connection)生效的表,数据存储在内存或磁盘临时文件中。可以通过创建临时表来处理临时性任务,提高查询的效率和可读性。本文将介绍MySQL临时表的创建、使用和销毁等操作。 创建 使用CREATE TEMPORARY TABLE命令创建临时表,参数与CREA…

    database 2023年5月22日
    00
  • SQL Server–怎样用ADO在SQL SERVER中建库,建表

    让我用markdown格式为您详细讲解如何使用ADO在SQL Server中建库和建表。 在SQL Server中使用ADO建库和建表 首先,我们需要确保已经安装了SQL Server,并且了解一些SQL语句的基础知识。 步骤1: 创建一个连接对象 要在SQL Server中使用ADO,首先需要创建一个连接对象。以下是一个示例: Dim conn Set c…

    database 2023年5月21日
    00
  • Windows和Linux系统下perl连接SQL Server数据库的方法

    Windows系统下perl连接SQL Server数据库的方法: 首先需要安装DBD::ODBC模块,可以使用cpanm进行安装,执行如下命令: cpanm DBD::ODBC 安装后可以使用以下perl代码连接SQL Server数据库: use DBI; my $dsn = ‘dbi:ODBC:driver={SQL Server};Server=12…

    database 2023年5月22日
    00
  • 常用SQL功能语句

    下面是关于常用SQL功能语句的完整攻略。 什么是SQL功能语句? SQL(Structured Query Language)结构化查询语言,是一种专门用于管理关系型数据库的语言,其主要作用是进行数据的查询、插入、修改和删除等操作。SQL包含了很多的语句和函数,可以满足不同的需求。 常用SQL功能语句 SELECT语句 SELECT语句是SQL中最基本的语句…

    database 2023年5月21日
    00
合作推广
合作推广
分享本页
返回顶部