本文目录导读:

我来为您创建一个PHP项目脚手架生成器,这是一个完整的命令行工具,可以快速生成规范的PHP项目结构。
项目结构
php-scaffold/
├── scaffold.php # 主入口文件
├── templates/ # 模板目录
│ ├── controller.tpl
│ ├── model.tpl
│ ├── view.tpl
│ └── config.tpl
└── README.md
Scaffold.php - 主脚手架文件
#!/usr/bin/env php
<?php
/**
* PHP Project Scaffold Generator
*
* 用法: php scaffold.php [项目名] [选项]
* 选项:
* --type=mvc|api|basic 项目类型 (默认: basic)
* --namespace=App 命名空间 (默认: App)
* --force 强制覆盖已存在文件
* --help 显示帮助信息
*/
class ScaffoldGenerator {
private $projectName;
private $projectType;
private $namespace;
private $projectPath;
private $force = false;
// 项目模板目录
private $templateDir = __DIR__ . '/templates';
// 目录结构模板
private $structureMVC = [
'app/Controllers',
'app/Models',
'app/Views',
'app/Middleware',
'config',
'public',
'public/assets/css',
'public/assets/js',
'public/assets/images',
'storage/cache',
'storage/logs',
'storage/uploads',
'database/migrations',
'database/seeds',
'routes',
'tests',
'vendor'
];
private $structureAPI = [
'app/Controllers',
'app/Models',
'app/Middleware',
'app/Validators',
'config',
'public',
'storage/cache',
'storage/logs',
'database/migrations',
'database/seeds',
'routes',
'tests',
'vendor'
];
private $structureBasic = [
'app',
'config',
'public',
'storage/cache',
'storage/logs',
'tests',
'vendor'
];
public function __construct($projectName, $projectType, $namespace, $force = false) {
$this->projectName = $this->sanitizeName($projectName);
$this->projectType = $projectType;
$this->namespace = $namespace;
$this->force = $force;
$this->projectPath = getcwd() . '/' . $this->projectName;
}
/**
* 主执行方法
*/
public function execute() {
echo "=================================\n";
echo " PHP 项目脚手架生成器 v1.0\n";
echo "=================================\n\n";
try {
// 1. 创建目录结构
$this->generateStructure();
echo "[✓] 创建目录结构完成\n";
// 2. 生成核心文件
$this->generateCoreFiles();
echo "[✓] 生成核心文件完成\n";
// 3. 生成配置文件
$this->generateConfigFiles();
echo "[✓] 生成配置文件完成\n";
// 4. 生成项目特定文件
$this->generateProjectFiles();
echo "[✓] 生成项目文件完成\n";
echo "\n=================================\n";
echo "🎉 项目创建成功!\n";
echo "项目路径: {$this->projectPath}\n";
echo "项目类型: {$this->projectType}\n";
echo "命名空间: {$this->namespace}\n\n";
// 5. 显示后续步骤
$this->showNextSteps();
} catch (Exception $e) {
echo "\n[✗] 错误: " . $e->getMessage() . "\n";
exit(1);
}
}
/**
* 创建目录结构
*/
private function generateStructure() {
$structure = $this->getStructureForType();
foreach ($structure as $dir) {
$path = $this->projectPath . '/' . $dir;
if (!is_dir($path)) {
mkdir($path, 0755, true);
}
}
}
/**
* 生成核心文件
*/
private function generateCoreFiles() {
// 创建入口文件
$indexContent = $this->getIndexContent();
file_put_contents($this->projectPath . '/public/index.php', $indexContent);
// 创建.htaccess
$htaccess = $this->getHtaccessContent();
file_put_contents($this->projectPath . '/public/.htaccess', $htaccess);
// 创建composer.json
$composerContent = $this->getComposerContent();
file_put_contents($this->projectPath . '/composer.json', $composerContent);
// 创建.env
$envContent = $this->getEnvContent();
file_put_contents($this->projectPath . '/.env', $envContent);
// 创建.gitignore
$gitignore = $this->getGitignoreContent();
file_put_contents($this->projectPath . '/.gitignore', $gitignore);
// 创建README
$readme = $this->getReadmeContent();
file_put_contents($this->projectPath . '/README.md', $readme);
}
/**
* 生成配置文件
*/
private function generateConfigFiles() {
$configs = [
'app.php' => $this->getAppConfig(),
'database.php' => $this->getDatabaseConfig(),
'routes.php' => $this->getRoutesConfig(),
'constants.php' => $this->getConstantsConfig()
];
foreach ($configs as $filename => $content) {
file_put_contents($this->projectPath . '/config/' . $filename, $content);
}
}
/**
* 生成项目特定文件
*/
private function generateProjectFiles() {
switch ($this->projectType) {
case 'mvc':
$this->generateMvcFiles();
break;
case 'api':
$this->generateApiFiles();
break;
default:
$this->generateBasicFiles();
}
}
/**
* MVC项目特有文件
*/
private function generateMvcFiles() {
// Controller示例
$controller = <<<PHP
<?php
// app/Controllers/HomeController.php
namespace {$this->namespace}\\Controllers;
class HomeController {
public function index() {
\$data = [
'title' => 'Welcome',
'message' => 'Hello from HomeController!'
];
return \$this->render('home', \$data);
}
private function render(\$template, \$data = []) {
extract(\$data);
\$viewPath = __DIR__ . '/../Views/' . \$template . '.php';
if (file_exists(\$viewPath)) {
require \$viewPath;
}
}
}
PHP;
file_put_contents($this->projectPath . '/app/Controllers/HomeController.php', $controller);
// Model示例
$model = <<<PHP
<?php
// app/Models/User.php
namespace {$this->namespace}\\Models;
class User {
private \$db;
public function __construct(\$pdo = null) {
\$this->db = \$pdo;
}
public function find(\$id) {
// 示例查询逻辑
return [
'id' => \$id,
'name' => 'John Doe',
'email' => 'john@example.com'
];
}
public function all() {
// 示例返回所有用户
return [];
}
}
PHP;
file_put_contents($this->projectPath . '/app/Models/User.php', $model);
// View示例
$view = <<<HTML
<!-- app/Views/home.php -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"><?php echo \$title ?? 'PHP Application'; ?></title>
<link rel="stylesheet" href="/assets/css/style.css">
</head>
<body>
<div class="container">
<h1><?php echo \$message ?? 'Welcome'; ?></h1>
<p>这是一个基于 MVC 模式的 PHP 项目</p>
</div>
</body>
</html>
HTML;
file_put_contents($this->projectPath . '/app/Views/home.php', $view);
// 路由示例
$routes = <<<PHP
<?php
{\$routes = [
'/' => 'HomeController@index',
'/user' => 'UserController@show',
'/login' => 'AuthController@login',
'/register' => 'AuthController@register'
];
return \$routes;
PHP;
file_put_contents($this->projectPath . '/routes/web.php', $routes);
}
/**
* API项目特有文件
*/
private function generateApiFiles() {
// API Controller示例
$controller = <<<PHP
<?php
// app/Controllers/Api/UserController.php
namespace {$this->namespace}\\Controllers\\Api;
class UserController {
public function index() {
return \$this->response(['data' => []], 200);
}
public function show(\$id) {
\$user = [
'id' => \$id,
'name' => 'John Doe',
'email' => 'john@example.com'
];
return \$this->response(['data' => \$user], 200);
}
public function store() {
// 处理POST请求
return \$this->response(['status' => 'created'], 201);
}
private function response(\$data, \$statusCode = 200) {
header('Content-Type: application/json');
http_response_code(\$statusCode);
echo json_encode(\$data);
exit;
}
}
PHP;
file_put_contents($this->projectPath . '/app/Controllers/Api/UserController.php', $controller);
// API路由
$routes = <<<PHP
<?php
// routes/api.php
return [
'GET /api/users' => 'Api\\UserController@index',
'GET /api/users/{id}' => 'Api\\UserController@show',
'POST /api/users' => 'Api\\UserController@store',
'PUT /api/users/{id}' => 'Api\\UserController@update',
'DELETE /api/users/{id}' => 'Api\\UserController@destroy'
];
PHP;
file_put_contents($this->projectPath . '/routes/api.php', $routes);
}
/**
* 生成基本项目文件
*/
private function generateBasicFiles() {
// 基础app文件
$appFile = <<<PHP
<?php
// app/app.php
namespace {$this->namespace};
class Application {
private \$db;
private \$config;
public function __construct(array \$config = []) {
\$this->config = \$config;
\$this->init();
}
private function init() {
// 初始化数据库连接
if (isset(\$this->config['database'])) {
// PDO连接示例
}
}
public function run() {
// 应用启动逻辑
echo "Application is running!\n";
}
}
PHP;
file_put_contents($this->projectPath . '/app/app.php', $appFile);
}
/**
* 获取入口文件内容
*/
private function getIndexContent() {
return <<<PHP
<?php
/**
* 项目入口文件
*
* @package {$this->projectName}
*/
define('APP_START', microtime(true));
define('ROOT_PATH', dirname(__DIR__));
define('APP_PATH', ROOT_PATH . '/app');
define('CONFIG_PATH', ROOT_PATH . '/config');
define('STORAGE_PATH', ROOT_PATH . '/storage');
define('PUBLIC_PATH', __DIR__);
// 自动加载
require ROOT_PATH . '/vendor/autoload.php';
// 加载配置文件
\$config = require CONFIG_PATH . '/app.php';
// 错误报告
if (\$config['debug']) {
error_reporting(E_ALL);
ini_set('display_errors', 1);
} else {
error_reporting(0);
ini_set('display_errors', 0);
}
// 测试页面
echo "<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">{$this->projectName}</title>
<style>
* { margin: 0; padding: 0; }
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
.welcome {
background: white;
padding: 40px 60px;
border-radius: 10px;
box-shadow: 0 20px 40px rgba(0,0,0,0.1);
text-align: center;
}
h1 { margin-bottom: 20px; color: #333; }
p { color: #666; margin-bottom: 15px; }
.version { font-size: 14px; color: #999; }
</style>
</head>
<body>
<div class="welcome">
<h1>🚀 {$this->projectName}</h1>
<p>项目创建成功!</p>
<p>PHP版本: " . PHP_VERSION . "</p>
<p class="version">生成时间: " . date('Y-m-d H:i:s') . "</p>
</div>
</body>
</html>";
PHP;
}
/**
* 获取.htaccess内容
*/
private function getHtaccessContent() {
return <<<HTACCESS
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]
HTACCESS;
}
/**
* 获取composer.json内容
*/
private function getComposerContent() {
$composer = [
'name' => strtolower($this->projectName),
'description' => "{$this->projectName} PHP Project",
'type' => 'project',
'require' => [
'php' => '>=7.4'
],
'autoload' => [
'psr-4' => [
$this->namespace . '\\\\' => 'app/'
]
],
'scripts' => [
'start' => 'php -S localhost:8000 -t public'
]
];
return json_encode($composer, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
}
/**
* 获取.env内容
*/
private function getEnvContent() {
return <<<ENV
# Application
APP_NAME={$this->projectName}
APP_ENV=development
APP_DEBUG=true
APP_URL=http://localhost:8000
# Database
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE={$this->projectName}
DB_USERNAME=root
DB_PASSWORD=
# Session
SESSION_DRIVER=file
SESSION_LIFETIME=120
# Cache
CACHE_DRIVER=file
# Logging
LOG_CHANNEL=daily
LOG_LEVEL=debug
ENV;
}
/**
* 获取.gitignore内容
*/
private function getGitignoreContent() {
return <<<GIT
# Dependencies
/vendor
/node_modules
# Environment
.env
.env.local
.env.production
# Logs
*.log
/storage/logs/*
!/storage/logs/.gitkeep
# Cache
/storage/cache/*
!/storage/cache/.gitkeep
# Uploads
/storage/uploads/*
!/storage/uploads/.gitkeep
# IDE
.idea/
.vscode/
*.swp
# OS
.DS_Store
Thumbs.db
# Test
/coverage/
/phpunit.xml
GIT;
}
/**
* 获取README内容
*/
private function getReadmeContent() {
return <<<README
# {$this->projectName}
${this->projectName} 项目说明文档
## 环境要求
- PHP >= 7.4
- Composer
## 环境搭建
1. 安装依赖
```bash
composer install
-
配置环境变量
cp .env.example .env
-
启动开发服务器
composer start
访问 http://localhost:8000
项目结构
{$this->projectName}/
├── app/ # 应用目录
├── config/ # 配置文件
├── database/ # 数据库迁移和种子
├── public/ # Web根目录
├── routes/ # 路由定义
├── storage/ # 存储目录
├── tests/ # 测试文件
└── vendor/ # 依赖包
开发工具
- PHP内置服务器:
php -S localhost:8000 -t public - 代码检查:
php -l - 测试:
phpunit
部署
Apache
配置虚拟主机指向 public 目录
Nginx
server {
listen 80;
server_name example.com;
root /var/www/{$this->projectName}/public;
location / {
try_files \$uri /index.php?\$query_string;
}
location ~ \.php\$ {
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
include fastcgi_params;
}
}
许可
请根据您的项目需求设置许可协议 README; }
/**
* 获取应用配置
*/
private function getAppConfig() {
return <<<PHP
<?php // config/app.php
return [ 'name' => '{$this->projectName}', 'env' => 'development', 'debug' => true, 'url' => 'http://localhost:8000', 'timezone' => 'Asia/Shanghai', 'locale' => 'zh_CN', 'providers' => [ // 服务提供商列表 ], ]; PHP; }
/**
* 获取数据库配置
*/
private function getDatabaseConfig() {
return <<<PHP
<?php // config/database.php
return [ 'default' => 'mysql', 'connections' => [ 'mysql' => [ 'driver' => 'mysql', 'host' => getenv('DB_HOST') ?: 'localhost', 'port' => getenv('DB_PORT') ?: '3306', 'database' => getenv('DB_DATABASE') ?: '{$this->projectName}', 'username' => getenv('DB_USERNAME') ?: 'root', 'password' => getenv('DB_PASSWORD') ?: '', 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', ], ], ]; PHP; }
/**
* 获取路由配置
*/
private function getRoutesConfig() {
return <<<PHP
<?php // config/routes.php
return [ 'GET /' => 'HomeController@index', 'GET /about' => 'PageController@about', 'POST /submit' => 'FormController@submit', ]; PHP; }
/**
* 获取常量配置
*/
private function getConstantsConfig() {
return <<<PHP
<?php // config/constants.php
// 应用常量 define('APP_NAME', '{$this->projectName}'); define('APP_VERSION', '1.0.0');
// 路径常量
define('BASE_PATH', dirname(DIR));
define('UPLOAD_PATH', BASE_PATH . '/storage/uploads');
define('LOG_PATH', BASE_PATH . '/storage/logs');
PHP;
}
/**
* 获取相应的目录结构
*/
private function getStructureForType() {
switch ($this->projectType) {
case 'mvc':
return $this->structureMVC;
case 'api':
return $this->structureAPI;
default:
return $this->structureBasic;
}
}
/**
* 显示后续步骤
*/
private function showNextSteps() {
echo "\n📋 后续步骤:\n";
echo " 1. 进入项目目录:cd {$this->projectName}\n";
echo " 2. 安装依赖:composer install\n";
echo " 3. 配置环境变量:cp .env .env.example\n";
echo " 4. 启动开发服务器:composer start\n\n";
echo "📁 项目结构说明:\n";
echo " - app/ 应用核心代码\n";
echo " - config/ 配置文件\n";
echo " - public/ 公共资源目录(Web根目录)\n";
echo " - routes/ 路由定义\n";
echo " - storage/ 存储目录(日志、缓存、上传文件)\n";
echo " - tests/ 测试目录\n\n";
}
/**
* 清理项目名称
*/
private function sanitizeName($name) {
$name = preg_replace('/[^a-zA-Z0-9_\-]/', '', $name);
if (empty($name)) {
throw new Exception("项目名称不能为空");
}
return $name;
}
// ---------- Command Line Interface ----------
function showHelp() { echo <<<HELP PHP 项目脚手架生成器 用法: php scaffold.php [项目名] [选项]
参数: 项目名 要创建的项目名称
选项: --type=mvc|api|basic 项目类型 (默认: basic) --namespace=App 命名空间 (默认: App) --force 强制覆盖已存在文件 --help 显示帮助信息
示例: php scaffold.php myproject php scaffold.php blog --type=mvc php scaffold.php api_server --type=api php scaffold.php myapp --namespace=MyApplication
HELP; exit(0); }
// 解析命令行参数 $args = $argv; array_shift($args); // 移除脚本名
// 检查参数 if (empty($args)) { showHelp(); }
$projectName = $args[0]; $type = 'basic'; $namespace = 'App'; $force = false;
// 解析选项 for ($i = 1; $i < count($args); $i++) { $arg = $args[$i];
switch (true) {
case $arg === '--help':
showHelp();
case strpos($arg, '--type=') === 0:
$type = str_replace('--type=', '', $arg);
if (!in_array($type, ['mvc', 'api', 'basic'])) {
echo "错误:无效的项目类型 '{$type}'\n";
echo "有效类型:mvc, api, basic\n";
exit(1);
}
break;
case strpos($arg, '--namespace=') === 0:
$namespace = str_replace('--namespace=', '', $arg);
// 清理命名空间
$namespace = preg_replace('/[^a-zA-Z0-9_\\\\]/', '', $namespace);
break;
case $arg === '--force':
$force = true;
break;
}
try { // 检查项目是否已存在 $projectPath = getcwd() . '/' . $projectName; if (is_dir($projectPath) && !$force) { echo "错误:项目 '{$projectName}' 已存在!\n"; echo "如果确实需要覆盖,请添加 --force 参数\n"; exit(1); }
// 创建生成器实例并执行
$scaffold = new ScaffoldGenerator(
$projectName,
$type,
$namespace,
$force
);
$scaffold->execute();
} catch (Exception $e) { echo "[✗] 错误: " . $e->getMessage() . "\n"; exit(1); }
## 使用说明
### 1. 基础使用
```bash
# 生成基础项目
php scaffold.php myapp
# 生成MVC项目
php scaffold.php blog --type=mvc
# 生成API项目
php scaffold.php api_server --type=api
# 指定命名空间
php scaffold.php myapp --namespace=MyApplication
# 覆盖已存在项目
php scaffold.php myapp --force
项目类型
# 基础项目 php scaffold.php demo # MVC项目(含控制器、模型、视图) php scaffold.php shop --type=mvc # API项目(含API示例、JSON响应) php scaffold.php api --type=api
生成的项目结构示例
MVC项目
myapp/
├── app/
│ ├── Controllers/
│ │ └── HomeController.php
│ ├── Models/
│ │ └── User.php
│ ├── Views/
│ │ └── home.php
│ └── Middleware/
├── config/
│ ├── app.php
│ ├── database.php
│ ├── routes.php
│ └── constants.php
├── database/
│ ├── migrations/
│ └── seeds/
├── public/
│ ├── index.php
│ ├── .htaccess
│ ├── assets/
│ │ ├── css/
│ │ ├── js/
│ │ └── images/
├── routes/
│ └── web.php
├── storage/
│ ├── cache/
│ ├── logs/
│ └── uploads/
├── tests/
├── vendor/
├── .env
├── .gitignore
├── composer.json
└── README.md
API项目示例
// 生成的API Controller示例
class UserController {
public function index() {
return $this->response(['data' => []], 200);
}
public function show($id) {
return $this->response(['data' => ['id' => $id]], 200);
}
public function store() {
return $this->response(['status' => 'created'], 201);
}
}
扩展模板
您可以通过修改 templates/ 目录下的文件来扩展模板,或者直接在 ScaffoldGenerator 类中添加自定义的生成方法。
注意事项
-
权限设置:生成的文件默认使用
0755权限,目录使用0755,文件使用0644 -
Windows兼容:代码兼容Windows和Linux系统
-
依赖管理:生成的项目使用Composer管理依赖
-
安全提示:生产环境记得修改密钥和环境配置
这个脚手架工具可以快速生成规范的项目结构,支持多种项目类型,方便扩展,您可以根据需要修改或添加新的模板!