PHP代码生成器与脚手架开发
PHP代码生成器与脚手架开发代码生成器可以提高开发效率减少重复劳动。通过命令行生成控制器、模型、中间件等代码模板。今天实现一个简单的代码生成器。先设计一个基础的文件生成器它读取模板文件替换变量生成目标文件。phpclass FileGenerator{private string $templateDir;private string $outputDir;public function __construct(string $templateDir, string $outputDir){$this-templateDir rtrim($templateDir, /);$this-outputDir rtrim($outputDir, /);}public function generate(string $template, string $output, array $variables []): void{$templatePath $this-templateDir . / . $template . .stub;if (!file_exists($templatePath)) {throw new RuntimeException(模板文件不存在: $templatePath);}$content file_get_contents($templatePath);$content $this-replaceVariables($content, $variables);$outputPath $this-outputDir . / . $output;$outputDir dirname($outputPath);if (!is_dir($outputDir)) {mkdir($outputDir, 0755, true);}file_put_contents($outputPath, $content);echo 已生成: $outputPath\n;}private function replaceVariables(string $content, array $variables): string{$search [];$replace [];foreach ($variables as $key $value) {$search[] {{ . $key . }};$search[] {{ . $key . }};$replace[] $value;$replace[] $value;}return str_replace($search, $replace, $content);}}?控制器模板// templates/controller.stubnamespace App\Http\Controllers;use App\Http\Requests\{{model}}Request;use App\Models\{{model}};use Illuminate\Http\JsonResponse;class {{model}}Controller extends Controller{public function index(): JsonResponse{$items {{model}}::paginate(20);return response()-json($items);}public function store({{model}}Request $request): JsonResponse{$item {{model}}::create($request-validated());return response()-json($item, 201);}public function show(int $id): JsonResponse{$item {{model}}::findOrFail($id);return response()-json($item);}public function update({{model}}Request $request, int $id): JsonResponse{$item {{model}}::findOrFail($id);$item-update($request-validated());return response()-json($item);}public function destroy(int $id): JsonResponse{{{model}}::findOrFail($id)-delete();return response()-json(null, 204);}}// 使用生成器$generator new FileGenerator(__DIR__ . /templates, __DIR__ . /output);$generator-generate(controller, Controllers/UserController.php, [model User,]);?脚手架命令集成到一起phpclass Scaffold{private FileGenerator $generator;public function __construct(){$this-generator new FileGenerator(__DIR__ . /stubs, __DIR__ . /app);}public function makeModel(string $name, array $fields []): void{$this-generator-generate(model, Models/$name.php, [model $name,fillable $this-formatFillable($fields),]);echo 模型 $name 已创建\n;}public function makeController(string $name): void{$this-generator-generate(controller, Http/Controllers/{$name}Controller.php, [model $name,modelVariable lcfirst($name),]);echo 控制器 {$name}Controller 已创建\n;}public function makeMiddleware(string $name): void{$this-generator-generate(middleware, Http/Middleware/{$name}.php, [class $name,]);echo 中间件 $name 已创建\n;}public function makeAll(string $name): void{$this-makeModel($name);$this-makeController($name);echo 已为 $name 生成所有文件\n;}private function formatFillable(array $fields): string{if (empty($fields)) return ;return . implode(, , $fields) . ;}}?代码生成器适合有固定模式的代码。控制器、模型、验证器的生成规则清晰用生成器可以避免手写重复代码。但要注意生成后的代码仍然需要手动修改和完善。生成器只是一个起点不是终点。