PHP 脚手架生成项目

wen PHP项目 4

本文目录导读:

PHP 脚手架生成项目

  1. 项目结构
  2. Scaffold.php - 主脚手架文件
  3. 项目结构
  4. 开发工具
  5. 部署
  6. 许可
  7. 生成的项目结构示例
  8. 扩展模板
  9. 注意事项

我来为您创建一个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
  1. 配置环境变量

    cp .env.example .env
  2. 启动开发服务器

    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 类中添加自定义的生成方法。

注意事项

  1. 权限设置:生成的文件默认使用 0755 权限,目录使用 0755,文件使用 0644

  2. Windows兼容:代码兼容Windows和Linux系统

  3. 依赖管理:生成的项目使用Composer管理依赖

  4. 安全提示:生产环境记得修改密钥和环境配置

这个脚手架工具可以快速生成规范的项目结构,支持多种项目类型,方便扩展,您可以根据需要修改或添加新的模板!

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