PHP 怎么PHP Skeleton项目

wen PHP项目 3

本文目录导读:

PHP 怎么PHP Skeleton项目

  1. 使用 Composer 创建
  2. 手动创建基础骨架
  3. 核心文件模板
  4. 使用生成器工具
  5. 使用容器化开发环境
  6. 常用框架的骨架差异
  7. 快速开始脚本
  8. 最佳实践

我来详细介绍如何创建PHP项目骨架(Skeleton),包括多种方式和最佳实践。

使用 Composer 创建

从 Packagist 获取骨架包

# 使用官方 skeleton
composer create-project symfony/skeleton my-project
# 使用 Laravel
composer create-project laravel/laravel my-project
# 使用 Slim
composer create-project slim/slim-skeleton my-project

创建自定义骨架包

# 克隆到本地
git clone git@github.com:yourusername/php-skeleton.git my-project
cd my-project
composer install

手动创建基础骨架

目录结构

my-project/
├── app/
│   ├── Controllers/
│   ├── Models/
│   ├── Services/
│   └── Middlewares/
├── config/
│   ├── app.php
│   ├── database.php
│   └── routes.php
├── public/
│   └── index.php
├── resources/
│   ├── views/
│   └── assets/
├── storage/
│   ├── logs/
│   └── cache/
├── tests/
├── vendor/
├── .env
├── .env.example
├── .gitignore
├── composer.json
└── README.md

composer.json 示例

{
    "name": "yourname/php-skeleton",
    "description": "PHP项目骨架",
    "type": "project",
    "require": {
        "php": "^8.1",
        "vlucas/phpdotenv": "^5.5",
        "monolog/monolog": "^3.0"
    },
    "require-dev": {
        "phpunit/phpunit": "^10.0",
        "symfony/var-dumper": "^6.0"
    },
    "autoload": {
        "psr-4": {
            "App\\": "app/",
            "App\\Tests\\": "tests/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/"
        }
    },
    "scripts": {
        "test": "phpunit",
        "dev": "php -S localhost:8000 -t public"
    }
}

核心文件模板

public/index.php

<?php
declare(strict_types=1);
use Dotenv\Dotenv;
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
require __DIR__ . '/../vendor/autoload.php';
// 加载环境变量
$dotenv = Dotenv::createImmutable(__DIR__ . '/../');
$dotenv->load();
// 错误报告配置
error_reporting(E_ALL);
ini_set('display_errors', $_ENV['APP_DEBUG'] ?? '0');
// 设置时区
date_default_timezone_set($_ENV['APP_TIMEZONE'] ?? 'UTC');
// 初始化日志
$logger = new Logger('app');
$logger->pushHandler(new StreamHandler(__DIR__ . '/../storage/logs/app.log', Logger::DEBUG));
// 简单的路由示例
$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
if ($uri === '/') {
    echo "Welcome to PHP Skeleton!";
} else {
    http_response_code(404);
    echo "404 Not Found";
}

config/database.php

<?php
return [
    'host' => $_ENV['DB_HOST'] ?? 'localhost',
    'port' => $_ENV['DB_PORT'] ?? '3306',
    'database' => $_ENV['DB_DATABASE'] ?? 'app',
    'username' => $_ENV['DB_USERNAME'] ?? 'root',
    'password' => $_ENV['DB_PASSWORD'] ?? '',
    'charset' => 'utf8mb4',
    // PDO 配置
    'options' => [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES => false,
    ],
];

.env.example

APP_NAME=MyApp
APP_ENV=development
APP_DEBUG=true
APP_TIMEZONE=Asia/Shanghai
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=app
DB_USERNAME=root
DB_PASSWORD=

.gitignore

/vendor/
/node_modules/
.env
/storage/logs/*.log
/storage/cache/*
!storage/logs/.gitkeep
!storage/cache/.gitkeep
.phpunit.result.cache

使用生成器工具

使用 make:file 命令

创建自定义命令:

# 创建脚手架命令
php bin/console make:controller
php bin/console make:model
php bin/console make:service

使用脚手架工具

<?php
// scripts/scaffold.php
class ScaffoldGenerator {
    public function createController(string $name): void {
        $template = <<<EOF
<?php
namespace App\Controllers;
class {$name}Controller
{
    public function index(): void
    {
        echo "{$name} index";
    }
}
EOF;
        file_put_contents(__DIR__ . "/../app/Controllers/{$name}Controller.php", $template);
    }
    public function createModel(string $name): void {
        $template = <<<EOF
<?php
namespace App\Models;
class {$name} extends BaseModel
{
    protected string \$table = '{$name.toLowerCase()}';
    protected array \$fillable = [
        // 添加字段
    ];
}
EOF;
        file_put_contents(__DIR__ . "/../app/Models/{$name}.php", $template);
    }
}

使用容器化开发环境

Docker Compose

version: '3.8'
services:
  php:
    build: .
    ports:
      - "8000:80"
    volumes:
      - .:/var/www/html
    environment:
      - APP_ENV=development
      - XDEBUG_MODE=debug
  mysql:
    image: mysql:8.0
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: applocal
    volumes:
      - mysql_data:/var/lib/mysql
volumes:
  mysql_data:

常用框架的骨架差异

框架 骨架特点 适合场景
Symfony 完整企业级,组件丰富 大型应用
Laravel 开发效率高,生态好 快速开发
Lumen 轻量级API 微服务
Slim 极简,灵活 REST API
自定义 完全控制 特殊需求

快速开始脚本

#!/bin/bash
# setup.sh - 项目初始化脚本
echo "Creating PHP Skeleton..."
# 创建目录结构
mkdir -p {app/{Controllers,Models,Services},config,public,src,resources/views,storage/{logs,cache},tests}
# 初始化 Composer
composer init --name="my/php-skeleton" --require="php:^8.1" --autoload="psr-4: App\\: app/"
# 安装依赖
composer require vlucas/phpdotenv
composer require --dev phpunit/phpunit
# 复制环境配置
cp .env.example .env
# 创建基础文件
touch public/index.php
touch app/Controllers/.gitkeep
touch app/Models/.gitkeep
echo "Skeleton project created successfully!"
echo "Run 'composer dev' to start development server"

最佳实践

初始化脚本 (composer.json)

{
    "scripts": {
        "post-create-project-cmd": [
            "php scripts/init.php"
        ]
    }
}

自动加载类(示例)

<?php
// app/Services/Database.php
namespace App\Services;
use PDO;
class Database {
    private static ?PDO $instance = null;
    public static function getInstance(): PDO {
        if (self::$instance === null) {
            $config = require __DIR__ . '/../../config/database.php';
            self::$instance = new PDO(
                "mysql:host={$config['host']};dbname={$config['database']}",
                $config['username'],
                $config['password'],
                $config['options']
            );
        }
        return self::$instance;
    }
}

使用 PHP 内置服务器

# 开发环境
php -S localhost:8000 -t public
# 带路由重写
php -S localhost:8000 -t public router.php

创建PHP项目骨架的最佳方式:

  1. 生产环境:使用成熟框架的官方骨架
  2. 学习目的:从零手动创建理解原理
  3. 团队内部:创建自定义骨架包并发布到私有仓库
  4. 快速原型:使用 Composer 创建简单骨架

选择符合你需求的方案,创建合适的骨架是PHP项目成功的第一步。

抱歉,评论功能暂时关闭!