Laravel PHP 后端开发指南:路由、Eloquent 与 Artisan
Laravel 是 PHP 世界最受欢迎的 Web 框架之一,定位是"让开发者专注业务、少操心琐事"。它自带上手极其顺滑的 ORM(Eloquent)、命令友好的 Artisan CLI,以及完整的中间件与认证体系。根据 Laravel 官方文档,本文围绕路由、Eloquent、中间件、Artisan 四条主线展开。
路由:一张表看清入口
Laravel 的路由集中定义在 routes/ 目录:routes/web.php 面向 Web 界面,routes/api.php 面向无状态的 API。执行 php artisan install:api 会安装 Sanctum 并创建 api.php,且自动加上 /api 前缀:
use Illuminate\Support\Facades\Route;
Route::get('/users', function () {
return 'Hello World';
});
Route::get('/users/{id}', function (string $id) {
return 'User ' . $id;
})->whereNumber('id');
路由参数用 {} 包裹,可用 where 系列方法做正则约束。多个路由需要共享中间件、前缀或子域名时,用路由组(Route Groups)统一配置。用 php artisan route:list 可以随时查看全部路由。
Eloquent ORM:模型即数据入口
每个数据库表对应一个 Eloquent 模型。执行 php artisan make:model Flight --migration 即可同时生成模型与迁移文件。模型按约定映射表名(蛇形复数),支持 findOrFail、firstOrCreate、聚合查询等便捷方法:
use App\Models\Flight;
$flight = Flight::findOrFail(1);
$count = Flight::where('active', 1)->count();
两个必须注意的实践:一是批量赋值保护——使用 create() 前必须在模型里声明 $fillable,否则可能引入 is_admin 之类的越权漏洞;二是软删除——加上 SoftDeletes trait 即可用 deleted_at 标记删除而不是真正删行,误删后还能 restore()。
Eloquent 关系:模型之间如何关联
Eloquent 最省心的地方在于关系定义。一个用户有多条订单、每条订单属于一个用户,只需在模型里声明关系方法:
class User extends Authenticatable
{
public function orders(): HasMany
{
return $this->hasMany(Order::class);
}
}
class Order extends Model
{
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
}
之后 $user->orders 就能直接拿到该用户的订单集合,配合 with('orders') 预加载,还能避免经典的 N+1 查询问题。集合用复数方法名(hasMany)、单个用单数(belongsTo),代码读起来几乎就是自然语言。
控制器与请求校验
路由回调可以指向控制器方法,职责更清晰:
Route::get('/users', [UserController::class, 'index']);
控制器里常用 Form Request 做请求校验:先 php artisan make:request StoreUserRequest,再在控制器方法中类型声明该请求类,Laravel 会在进入方法前自动完成校验,失败时返回 422 与错误信息。涉及多个写操作时,用 DB::transaction(fn () => ...) 保证要么全部成功、要么全部回滚;配合队列(dispatch),还能把发邮件、调用第三方接口等耗时操作异步化,避免阻塞用户请求。
队列:把耗时操作挪出请求
发邮件、调第三方接口、生成报表这类操作不应该阻塞用户请求。Laravel 的队列系统把这些任务丢到后台执行:
dispatch(function () {
// 后台执行的任务,例如发送通知、写入日志
})->afterResponse();
正式一点的做法是生成一个 Job 类(php artisan make:job SendOrderConfirmation),把逻辑放在 handle() 里,用 dispatch() 推入队列。配合 Horizon 管理队列进程、失败重试与监控:任务失败时 Laravel 会按配置自动重试,并把失败原因写入 failed_jobs 表,方便事后排查。
中间件:请求进入前的关卡
中间件用于过滤进入应用的请求,例如认证、限流、CORS。Laravel 默认带 web 与 api 两个中间件组,api 组内置了频率限制:
Route::middleware(['auth:sanctum'])->group(function () {
Route::get('/user', function (Request $request) {
return $request->user();
});
});
中间件的执行顺序就是 kernel 里数组声明的顺序,这个顺序值得写进文档:认证放在限流之前还是之后,会影响同一请求被拒绝时的状态码与日志形态。另外,Laravel 还提供了 Gate 与 Policy 做细粒度的授权判断(例如"只有订单创建者能修改该订单"),比在控制器里堆 if 判断更规范,也更方便测试。
Artisan:命令行生产力
Artisan 是 Laravel 的命令行工具,能大幅提升开发效率:
php artisan make:model/make:controller:生成代码骨架;php artisan route:list/route:cache:查看与缓存路由;php artisan migrate:执行数据库迁移;php artisan model:prune:按计划清理过期数据。
配合 Schedule::command('model:prune')->daily() 这样的调度声明,很多周期性运维都能交给框架。
部署与维护
生产环境建议执行 php artisan config:cache、route:cache 与 view:cache 缓存配置、路由与视图,显著加快请求处理;追求更高吞吐的团队可以用 Octane 让 Laravel 常驻内存运行。部署流程里记得用 php artisan migrate --force 同步数据库结构,并通过 Horizon 管理队列,配合 Pulse / Telescope 实时观察请求与异常。同时建议在 CI/CD 里加入 php artisan test 跑一遍测试套件(Pest / PHPUnit),避免改动路由或模型时把线上行为弄坏。发布前还可以用 php artisan about 快速核对环境与版本信息,配合 Sentry 等工具做异常上报,第一时间发现线上问题。
常见问题速查
- 改了路由却不生效? 先检查是否执行过
route:cache;若配置了路由缓存,发布流程里要同步重新缓存或清理,否则旧路由会一直在内存里。 create()报 MassAssignmentException? 这是 Laravel 的批量赋值保护在起作用——检查模型是否声明了$fillable,而不是急着关掉保护。- 列表页查询很慢? 用 Telescope 或
DB::enableQueryLog()查看实际 SQL,确认是否命中索引、是否因为缺少with()预加载而触发 N+1。 - 改了
.env不生效? 若配置已缓存,需要先php artisan config:clear再重新缓存。
参考:Laravel 官方文档(Eloquent 关系) https://laravel.com/docs/12.x/eloquent-relationships
参考:Laravel 官方文档(队列) https://laravel.com/docs/12.x/queues
16IDC 观察
Laravel 尤其适合内容型网站、电商与后台管理系统,官方生态(Forge、Nova、Sanctum 等)覆盖面广。若你只是需要简单的表单处理,可参考本站 PHP 联系表单处理;遇到老项目 mysql_connect 兼容问题时见 PHP 7 兼容 mysql_connect 的代码层实现方法。API 安全方面可参考 API 安全认证机制。更多内容见 后端对接 分类。