【PHP】- 项目通用目次架构及示例demo

打印 上一主题 下一主题

主题 1888|帖子 1888|积分 5664

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一. 前言

在PHP项目开发中,合理的目次布局有助于提高代码的可维护性、可扩展性和团队协作服从。尽管具体的目次架构可能会根据项目的规模、类型(如是否使用框架)以及团队的风俗有所不同,但这里提供一个通用且推荐的PHP项目目次布局示例,适用于非框架或轻量级框架的项目。如果你正在使用像Laravel、Symfony这样的今世PHP框架,它们通常会有自己推荐的目次布局。
二. 通用PHP项目目次布局

  1. my-php-project/
  2. ├── app/                   # 应用程序的核心代码
  3. │   ├── Controllers/       # 控制器,处理用户请求和响应
  4. │   ├── Models/            # 数据模型和业务逻辑
  5. │   ├── Views/             # 视图文件,用于展示数据
  6. │   └── Services/          # 服务类,封装复杂业务逻辑或第三方服务交互
  7. ├── config/                # 配置文件
  8. ├── public/                # 公共访问目录,放置前端控制器(index.php)和静态资源
  9. │   ├── css/
  10. │   ├── js/
  11. │   ├── images/
  12. │   └── index.php          # 前端控制器,所有HTTP请求入口
  13. ├── src/                   # 源代码,如果应用较大,可以将核心逻辑与app分离
  14. ├── tests/                 # 测试代码,包括单元测试、集成测试等
  15. ├── vendor/                # Composer依赖包目录
  16. ├── .env                   # 环境变量配置文件
  17. ├── composer.json          # Composer配置文件,定义项目依赖
  18. ├── phpunit.xml            # PHPUnit配置文件
  19. └── README.md              # 项目说明文档
复制代码
细节说明


  • app/: 这是应用程序的焦点部分,通常包含控制器、模型、视图和服务层。
  • Controllers/: 包含控制哀求流的应用逻辑,负责接收哀求、调用相应的模型方法并返回视图给客户端。
  • Models/: 数据模型,表现数据库中的表或其他数据源,并包含相干的业务逻辑。
  • Views/: 用户界面部分,通常是HTML模板,也可能结合模板引擎使用。
  • Services/: 服务层,用于组织复杂的业务逻辑或者与外部体系交互的逻辑。
  • config/: 存放应用程序的各种配置文件,比方数据库连接信息、第三方API密钥等。
  • public/:Web服务器的根目次,应包含全部可以通过Web直接访问的文件。index.php作为前端控制器,全部的HTTP哀求都会通过它进入应用程序。
  • src/: 如果你的项目足够大,可能需要将焦点逻辑从app/中分离出来放入此目次。
  • tests/: 单元测试、功能测试等自动化测试代码存放的地方,确保代码质量。
  • vendor/: 使用Composer管理的全部第三方库和依赖项会自动安装到这个目次下。
  • .env: 环境变量配置文件,用于存储不同环境下的配置参数(如开发、测试、生产环境),不建议将其提交到版本控制体系中。
  • composer.json: 界说了项目的依赖关系以及脚本命令等信息。
  • phpunit.xml: PHPUnit的配置文件,指定了测试套件的位置、报告格式等设置。
  • README.md: 提供关于项目的基本信息、如何安装、运行和贡献等内容。
示例demo

以下是一个简朴的PHP Web项目示例,展示了一个基本的用户管理体系。该项目包罗用户的注册、登录和查看用户列表功能。我们将使用MVC(Model-View-Controller)架构来组织代码,并结合MySQL数据库存储数据。
项目目次布局
  1. my-web-project/
  2. ├── app/
  3. │   ├── Controllers/       # 控制器
  4. │   │   ├── UserController.php
  5. │   ├── Models/            # 模型
  6. │   │   ├── UserModel.php
  7. │   ├── Views/             # 视图
  8. │   │   ├── register.php
  9. │   │   ├── login.php
  10. │   │   ├── users.php
  11. │   │   └── header.php
  12. ├── config/                # 配置文件
  13. │   ├── database.php
  14. ├── public/                # 公共访问目录
  15. │   ├── css/
  16. │   │   └── style.css
  17. │   ├── js/
  18. │   │   └── script.js
  19. │   └── index.php          # 前端控制器
  20. ├── .env                   # 环境变量配置文件
  21. ├── composer.json          # Composer配置文件
  22. └── README.md              # 项目说明文档
复制代码
1. 数据库设计

创建一个名为 users 的表:
  1. CREATE DATABASE my_web_project;
  2. USE my_web_project;
  3. CREATE TABLE users (
  4.     id INT AUTO_INCREMENT PRIMARY KEY,
  5.     username VARCHAR(50) NOT NULL UNIQUE,
  6.     password VARCHAR(255) NOT NULL,
  7.     email VARCHAR(100) NOT NULL UNIQUE,
  8.     created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  9. );
复制代码
2. 焦点代码

config/database.php连接数据库的配置文件:
  1. <?php
  2. $host = 'localhost';
  3. $port = 3306;
  4. $dbname = 'my_web_project';
  5. $username = 'root';
  6. $password = 'root';
  7. try {
  8.     $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password);
  9.     $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  10. } catch (PDOException $e) {
  11.     die("数据库连接失败: " . $e->getMessage());
  12. }
  13. return $pdo;
复制代码
app/Models/UserModel.php 用户模型,负责与数据库交互:
  1. <?php
  2. class UserModel {
  3.     private $pdo;
  4.     public function __construct($pdo) {
  5.         $this->pdo = $pdo;
  6.     }
  7.     // 注册新用户
  8.     public function register($username, $password, $email) {
  9.         $hashedPassword = password_hash($password, PASSWORD_DEFAULT);
  10.         $stmt = $this->pdo->prepare("INSERT INTO users (username, password, email) VALUES (?, ?, ?)");
  11.         return $stmt->execute([$username, $hashedPassword, $email]);
  12.     }
  13.     // 用户登录
  14.     public function login($username, $password) {
  15.         $stmt = $this->pdo->prepare("SELECT * FROM users WHERE username = ?");
  16.         $stmt->execute([$username]);
  17.         $user = $stmt->fetch(PDO::FETCH_ASSOC);
  18.         if ($user && password_verify($password, $user['password'])) {
  19.             return $user;
  20.         }
  21.         return false;
  22.     }
  23.     // 获取所有用户
  24.     public function getAllUsers() {
  25.         $stmt = $this->pdo->query("SELECT id, username, email, created_at FROM users");
  26.         return $stmt->fetchAll(PDO::FETCH_ASSOC);
  27.     }
  28. }
复制代码
app/Controllers/UserController.php用户控制器,处理哀求逻辑:
  1. <?php
  2. require_once '../Models/UserModel.php';
  3. class UserController {
  4.     private $userModel;
  5.     public function __construct($pdo) {
  6.         $this->userModel = new UserModel($pdo);
  7.     }
  8.     // 显示注册页面
  9.     public function showRegisterForm() {
  10.         require_once '../Views/register.php';
  11.     }
  12.     // 处理注册请求
  13.     public function register() {
  14.         if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  15.             $username = $_POST['username'];
  16.             $password = $_POST['password'];
  17.             $email = $_POST['email'];
  18.             if ($this->userModel->register($username, $password, $email)) {
  19.                 echo "注册成功!";
  20.             } else {
  21.                 echo "注册失败,请重试。";
  22.             }
  23.         }
  24.     }
  25.     // 显示登录页面
  26.     public function showLoginForm() {
  27.         require_once '../Views/login.php';
  28.     }
  29.     // 处理登录请求
  30.     public function login() {
  31.         if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  32.             $username = $_POST['username'];
  33.             $password = $_POST['password'];
  34.             $user = $this->userModel->login($username, $password);
  35.             if ($user) {
  36.                 echo "登录成功!欢迎回来,{$user['username']}!";
  37.             } else {
  38.                 echo "用户名或密码错误。";
  39.             }
  40.         }
  41.     }
  42.     // 显示用户列表
  43.     public function showUsers() {
  44.         $users = $this->userModel->getAllUsers();
  45.         require_once '../Views/users.php';
  46.     }
  47. }
复制代码
public/index.php前端控制器,路由哀求到相应的控制器方法:
  1. <?php
  2. require_once '../config/database.php';
  3. require_once '../app/Controllers/UserController.php';
  4. $pdo = require '../config/database.php';
  5. $userController = new UserController($pdo);
  6. $action = $_GET['action'] ?? 'home';
  7. switch ($action) {
  8.     case 'register':
  9.         if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  10.             $userController->register();
  11.         } else {
  12.             $userController->showRegisterForm();
  13.         }
  14.         break;
  15.     case 'login':
  16.         if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  17.             $userController->login();
  18.         } else {
  19.             $userController->showLoginForm();
  20.         }
  21.         break;
  22.     case 'users':
  23.         $userController->showUsers();
  24.         break;
  25.     default:
  26.         echo "欢迎来到用户管理系统!";
  27.         break;
  28. }
复制代码
3. 视图文件

app/Views/register.php注册表单:
  1. <?php require_once 'header.php'; ?>
  2. <h1>注册</h1>
  3. <form method="POST" action="?action=register">
  4.     <label>用户名:<input type="text" name="username" required></label><br>
  5.     <label>密码:<input type="password" name="password" required></label><br>
  6.     <label>邮箱:<input type="email" name="email" required></label><br>
  7.     <button type="submit">注册</button>
  8. </form>
复制代码
app/Views/login.php登录表单:
  1. <?php require_once 'header.php'; ?>
  2. <h1>登录</h1>
  3. <form method="POST" action="?action=login">
  4.     <label>用户名:<input type="text" name="username" required></label><br>
  5.     <label>密码:<input type="password" name="password" required></label><br>
  6.     <button type="submit">登录</button>
  7. </form>
复制代码
app/Views/users.php用户列表:
  1. <?php require_once 'header.php'; ?>
  2. <h1>用户列表</h1>
  3. <table border="1">
  4.     <tr>
  5.         <th>ID</th>
  6.         <th>用户名</th>
  7.         <th>邮箱</th>
  8.         <th>注册时间</th>
  9.     </tr>
  10.     <?php foreach ($users as $user): ?>
  11.         <tr>
  12.             <td><?= htmlspecialchars($user['id']) ?></td>
  13.             <td><?= htmlspecialchars($user['username']) ?></td>
  14.             <td><?= htmlspecialchars($user['email']) ?></td>
  15.             <td><?= htmlspecialchars($user['created_at']) ?></td>
  16.         </tr>
  17.     <?php endforeach; ?>
  18. </table>
复制代码
4. 运行项目



  • 将项目代码放到Web服务器(如Apache/Nginx)的根目次。
  • 创建数据库并导入SQL脚本。
  • 访问 http://localhost/my-web-project/public/index.php?action=register
    注册新用户。
  • 登录后可以查看用户列表。
这个示例展示了如何构建一个简朴的PHP Web项目,涵盖了用户注册、登录和用户管理的基本功能。通过MVC架构分离了业务逻辑、数据访问和视图展示,为项目的扩展和维护提供了良好的基础。
三. 总结

这种目次布局旨在为开发者提供清楚的层次感和良好的组织方式,使得无论是个人开发照旧团队协作都能更加高效。当然,具体实验时可以根据项目的具体需求进行调整。比方,在使用特定框架时,如Laravel,其推荐的目次布局会有一些不同,但团体理念相似。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

魏晓东

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表