Skip to content

Laravel开发最佳实践指南

引言

Laravel是一个优雅的PHP Web应用框架,本文将分享在实际项目中总结的Laravel开发最佳实践。

项目结构

目录组织

bash
app/
├── Console/          # 命令行命令
├── Http/            
   ├── Controllers/ # 控制器
   ├── Middleware/  # 中间件
   └── Requests/    # 表单请求验证
├── Models/          # 模型
├── Services/        # 业务服务层
├── Repositories/    # 数据仓库层
└── Providers/       # 服务提供者

代码规范

控制器最佳实践

php
namespace App\Http\Controllers;

use App\Http\Requests\StoreUserRequest;
use App\Services\UserService;
use App\Http\Resources\UserResource;

class UserController extends Controller
{
    protected $userService;

    public function __construct(UserService $userService)
    {
        $this->userService = $userService;
    }

    public function store(StoreUserRequest $request)
    {
        $user = $this->userService->createUser($request->validated());
        
        return new UserResource($user);
    }
}

服务层实现

php
namespace App\Services;

use App\Repositories\UserRepository;
use App\Events\UserCreated;

class UserService
{
    protected $userRepository;

    public function __construct(UserRepository $userRepository)
    {
        $this->userRepository = $userRepository;
    }

    public function createUser(array $data)
    {
        $user = $this->userRepository->create($data);
        
        event(new UserCreated($user));
        
        return $user;
    }
}

数据库最佳实践

模型关系定义

php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class Order extends Model
{
    protected $fillable = [
        'user_id',
        'total_amount',
        'status',
    ];

    public function user(): BelongsTo
    {
        return $this->belongsTo(User::class);
    }

    public function items(): HasMany
    {
        return $this->hasMany(OrderItem::class);
    }
}

查询作用域

php
namespace App\Models;

use Illuminate\Database\Eloquent\Builder;

class Post extends Model
{
    public function scopePublished(Builder $query): Builder
    {
        return $query->where('status', 'published');
    }

    public function scopePopular(Builder $query): Builder
    {
        return $query->where('views', '>', 1000);
    }
}

API开发最佳实践

API资源

php
namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class UserResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'email' => $this->email,
            'created_at' => $this->created_at->toIso8601String(),
            'posts' => PostResource::collection($this->whenLoaded('posts')),
        ];
    }
}

请求验证

php
namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreUserRequest extends FormRequest
{
    public function rules()
    {
        return [
            'name' => 'required|string|max:255',
            'email' => 'required|email|unique:users',
            'password' => 'required|min:8|confirmed',
        ];
    }
}

缓存策略

缓存实现

php
namespace App\Services;

use Illuminate\Support\Facades\Cache;

class PostService
{
    public function getPopularPosts()
    {
        return Cache::remember('popular_posts', 3600, function () {
            return Post::popular()
                ->with('author')
                ->limit(10)
                ->get();
        });
    }
}

队列处理

任务定义

php
namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

class ProcessPodcast implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $podcast;

    public function __construct($podcast)
    {
        $this->podcast = $podcast;
    }

    public function handle()
    {
        // 处理播客
    }
}

测试实践

功能测试

php
namespace Tests\Feature;

use Tests\TestCase;
use App\Models\User;

class UserTest extends TestCase
{
    public function test_can_create_user()
    {
        $response = $this->postJson('/api/users', [
            'name' => 'John Doe',
            'email' => 'john@example.com',
            'password' => 'password',
            'password_confirmation' => 'password',
        ]);

        $response->assertStatus(201)
            ->assertJson([
                'data' => [
                    'name' => 'John Doe',
                    'email' => 'john@example.com',
                ]
            ]);
    }
}

安全最佳实践

  1. 使用HTTPS
  2. 实现CSRF保护
  3. XSS防护
  4. SQL注入防护
  5. 密码加密存储

性能优化

  1. 数据库优化

    • 合理使用索引
    • 优化查询语句
    • 使用数据库连接池
  2. 缓存优化

    • 使用Redis缓存
    • 实现缓存预热
    • 合理设置缓存过期时间
  3. 代码优化

    • 延迟加载
    • 使用集合处理
    • 避免N+1查询问题

部署最佳实践

  1. 环境配置

    • 使用.env文件
    • 区分开发和生产环境
    • 敏感信息加密
  2. 自动化部署

    • 使用CI/CD
    • 版本控制
    • 回滚机制

监控和日志

  1. 日志记录

    • 使用Monolog
    • 错误追踪
    • 性能监控
  2. 异常处理

    • 自定义异常处理器
    • 错误报告
    • 调试模式配置

参考资料

  1. Laravel官方文档
  2. PHP PSR规范
  3. Laravel最佳实践
  4. 设计模式
  5. RESTful API设计指南

幸运的人用童年治愈一生,不幸的人用一生治愈童年 —— 强爸