本文目录导读:

我来详细介绍如何创建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项目骨架的最佳方式:
- 生产环境:使用成熟框架的官方骨架
- 学习目的:从零手动创建理解原理
- 团队内部:创建自定义骨架包并发布到私有仓库
- 快速原型:使用 Composer 创建简单骨架
选择符合你需求的方案,创建合适的骨架是PHP项目成功的第一步。