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 即可同时生成模型与迁移文件。模型按约定映射表名(蛇形复数),支持 findOrFailfirstOrCreate、聚合查询等便捷方法:

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 默认带 webapi 两个中间件组,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:cacheroute:cacheview: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 安全认证机制。更多内容见 后端对接 分类。

原文来源:https://laravel.com/docs/12.x/routing