如何在 Laravel 上开发大型应用程序:最佳编码模式、文件夹结构和最佳编码实践(第 1 部分)
在 Laravel 上开发大型应用程序需要遵循明确的架构模式、文件夹结构以及最佳编码实践,以确保代码可维护、可扩展和高性能。以下是 第 1 部分 的详细内容,包括项目规划、文件夹结构的优化、编码模式和基础的最佳实践。
在开始编码之前,需要明确应用程序的结构和功能。
默认的 Laravel 文件夹结构对于小型项目非常合适,但在大型项目中可以调整或扩展。
以下是优化后的结构:
app/
├── Console/ // Artisan 命令
├── Domains/ // 领域逻辑,按模块分组 (如 User, Product, Order)
│ ├── User/
│ │ ├── Models/
│ │ ├── Repositories/
│ │ ├── Services/
│ │ ├── Controllers/
│ │ └── Policies/
│ ├── Order/
│ └── ...
├── Http/
│ ├── Middleware/
│ ├── Requests/
│ └── Resources/
├── Services/ // 核心服务类,如支付网关、通知
├── Jobs/ // 队列任务
├── Events/ // 事件与监听器
├── Observers/ // Eloquent 模型观察者
├── Rules/ // 自定义验证规则
├── Exceptions/ // 自定义异常
config/ // 配置文件
routes/ // 路由文件
resources/ // 前端资源(Blade 视图、JS、CSS)
storage/ // 缓存、日志、文件存储
tests/ // 测试代码
按领域划分逻辑,避免单一文件夹中代码过于庞大。
例如,Domains/User/ 包含:
通过 Repository 将数据访问逻辑与业务逻辑分离。
示例:
app/Domains/User/Repositories/UserRepositoryInterface.php
interface UserRepositoryInterface
{
public function getAllUsers();
public function findUserById($id);
}
app/Domains/User/Repositories/EloquentUserRepository.php
class EloquentUserRepository implements UserRepositoryInterface
{
public function getAllUsers()
{
return User::all();
}
public function findUserById($id)
{
return User::find($id);
}
}
$this->app->bind(UserRepositoryInterface::class, EloquentUserRepository::class);
服务类用于实现业务逻辑,避免将逻辑堆积在控制器中。
示例:app/Domains/User/Services/UserService.php
class UserService
{
protected $userRepository;
public function __construct(UserRepositoryInterface $userRepository)
{
$this->userRepository = $userRepository;
}
public function createUser(array $data)
{
return $this->userRepository->create($data);
}
}
示例控制器:
class UserController extends Controller
{
protected $userService;
public function __construct(UserService $userService)
{
$this->userService = $userService;
}
public function store(Request $request)
{
$user = $this->userService->createUser($request->all());
return response()->json($user, 201);
}
}
将请求验证从控制器移到独立的 Form Request 类。
示例:app/Http/Requests/CreateUserRequest.php
class CreateUserRequest extends FormRequest
{
public function rules()
{
return [
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users',
'password' => 'required|string|min:8',
];
}
}
在控制器中使用:
public function store(CreateUserRequest $request)
{
$user = $this->userService->createUser($request->validated());
return response()->json($user, 201);
}
通过 Laravel Resource 定义标准化的 API 响应。
示例:app/Http/Resources/UserResource.php
class UserResource extends JsonResource
{
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'email' => $this->email,
'created_at' => $this->created_at->toDateTimeString(),
];
}
}
在控制器中返回:
return new UserResource($user);
如果对某些部分有进一步的疑问或需要示例代码,请告诉我!
2025 年陆剧市场依旧热度爆棚
时间:2025-09-19
阵地央一首播:年度高品质大剧,深度解锁文化抗战三重非凡意义
时间:2025-09-18
陈展鹏刘佩玥《巨塔之后》今首播
时间:2025-08-28
生万物大结局惊现最招恨角色,原来真正的坏都披着善的“羊皮”!
时间:2025-08-28
归队6集燃爆:袁姗姗化身“战地玫瑰”,实战军医双在线超吸睛!
时间:2025-08-28
许凯田曦薇新剧《子夜归》首播,点击率位列第七
时间:2025-08-21