Skip to content

代码规范

基于 dux-php-admin 实际项目的代码规范和开发实践。

🚀 核心规范

属性驱动开发

使用 PHP 8+ 属性定义路由和资源:

php
<?php

namespace App\System\Admin;

use App\System\Models\SystemUser;
use Core\Resources\Action\Resources;
use Core\Resources\Attribute\Resource;

#[Resource(app: 'admin', route: '/system/user', name: 'system.user')]
class User extends Resources
{
    protected string $model = SystemUser::class;

    public function transform(object $item): array
    {
        return [
            'id' => $item->id,
            'username' => $item->username,
            'status' => (bool)$item->status,
            'created_at' => $item->created_at?->format('Y-m-d H:i:s'),
        ];
    }
}

模型定义

使用 AutoMigrate 属性自动创建数据表:

php
<?php

namespace App\System\Models;

use Core\Database\Eloquent\Model;
use Core\Database\Attribute\AutoMigrate;
use Illuminate\Database\Schema\Blueprint;

#[AutoMigrate]
class SystemUser extends Model
{
    public $table = "system_user";

    public function migration(Blueprint $table)
    {
        $table->id();
        $table->string('username')->unique()->comment('用户名');
        $table->string('password')->comment('密码');
        $table->boolean('status')->default(true)->comment('状态');
        $table->timestamps();
    }

    protected $fillable = ['username', 'password', 'status'];
    protected $hidden = ['password'];
    protected $casts = ['status' => 'boolean'];
}

服务类

静态方法处理业务逻辑:

php
<?php

namespace App\System\Service;

class UserService
{
    /**
     * 创建用户
     */
    public static function createUser(array $data): array
    {
        // 验证数据
        if (empty($data['username'])) {
            throw new \Exception('用户名不能为空');
        }

        // 创建用户
        $user = SystemUser::create([
            'username' => $data['username'],
            'password' => password_hash($data['password'], PASSWORD_DEFAULT),
            'status' => true
        ]);

        return ['id' => $user->id, 'username' => $user->username];
    }
}

📋 命名规范

文件和类名

  • 控制器: User.php (不用 Controller 后缀)
  • 模型: SystemUser.php (表名前缀 + 单数)
  • 服务: UserService.php
  • 中间件: AuthMiddleware.php

方法名

  • 查询: queryMany(), queryOne()
  • 操作: store(), delete()
  • 转换: transform()
  • 验证: validate()

数据库字段

  • 表名: system_user (模块_功能)
  • 字段: created_at, updated_at (下划线)
  • 外键: user_id, role_id

🛡️ 安全实践

数据验证

php
public function store(ServerRequestInterface $request, ResponseInterface $response): ResponseInterface
{
    $data = $request->getParsedBody();

    // 验证必填字段
    if (empty($data['username'])) {
        return error($response, '用户名不能为空');
    }

    // 创建数据
    $user = $this->model::create($data);

    return success($response, '创建成功', $this->transform($user));
}

权限检查

php
use App\System\Service\Auth;

public function delete(ServerRequestInterface $request, ResponseInterface $response, array $args): ResponseInterface
{
    // 检查权限
    if (!Auth::check($request, 'system.user.delete')) {
        return error($response, '无权限操作', null, 403);
    }

    $id = (int)$args['id'];
    $this->model::destroy($id);

    return success($response, '删除成功');
}

⚡ 性能优化

查询优化

php
// ✅ 使用预加载避免 N+1 问题
$users = SystemUser::with(['roles'])->get();

// ✅ 只查询需要的字段
$users = SystemUser::select(['id', 'username', 'status'])->get();

// ✅ 使用分页
public function queryMany(Builder $query, ServerRequestInterface $request, array $args): void
{
    $query->select(['id', 'username', 'status', 'created_at']);
}

缓存使用

php
use Core\Cache\Cache;

// 缓存配置数据
$config = Cache::remember('system_config', 3600, function() {
    return Config::getJsonValue('system', []);
});

🔧 配置管理

TOML 配置

基于 config/use.toml 的实际配置:

toml
[app]
name = "我的 DuxLite 应用"
debug = true
timezone = "Asia/Shanghai"
secret = "your-app-secret-key"
domain = "http://localhost:8000"

[vite]
dev = false
port = 5173

[cloud]
key = ""

环境配置

  • 开发环境: config/use.dev.toml
  • 生产环境: config/use.toml
  • 数据库配置: config/database.toml

🧪 测试规范

单元测试

php
<?php

namespace Tests\Unit;

use PHPUnit\Framework\TestCase;
use App\System\Service\UserService;

class UserServiceTest extends TestCase
{
    public function testCreateUser()
    {
        $userData = [
            'username' => 'testuser',
            'password' => '123456'
        ];

        $result = UserService::createUser($userData);

        $this->assertArrayHasKey('id', $result);
        $this->assertEquals('testuser', $result['username']);
    }
}

🎉 总结

DuxLite 代码规范要点:

  • 属性驱动: 使用 PHP 8+ 属性定义路由和模型
  • 自动迁移: 模型中定义数据表结构
  • 静态服务: 业务逻辑使用静态方法
  • 安全优先: 数据验证和权限检查
  • 性能优化: 查询优化和缓存使用

遵循这些规范可以写出简洁、安全、高效的代码!