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',
]
]);
}
}
安全最佳实践
- 使用HTTPS
- 实现CSRF保护
- XSS防护
- SQL注入防护
- 密码加密存储
性能优化
数据库优化
- 合理使用索引
- 优化查询语句
- 使用数据库连接池
缓存优化
- 使用Redis缓存
- 实现缓存预热
- 合理设置缓存过期时间
代码优化
- 延迟加载
- 使用集合处理
- 避免N+1查询问题
部署最佳实践
环境配置
- 使用.env文件
- 区分开发和生产环境
- 敏感信息加密
自动化部署
- 使用CI/CD
- 版本控制
- 回滚机制
监控和日志
日志记录
- 使用Monolog
- 错误追踪
- 性能监控
异常处理
- 自定义异常处理器
- 错误报告
- 调试模式配置
参考资料
- Laravel官方文档
- PHP PSR规范
- Laravel最佳实践
- 设计模式
- RESTful API设计指南