ToolkitX
知识库工具箱

Laravel 入门

路由、控制器、Eloquent ORM

30min·进阶

01. Laravel 安装和路由

Laravel 是 PHP 最流行的 Web 框架,基于 MVC 模式。用 Composer 创建项目,artisan 是命令行工具。路由定义在 routes/web.php 里,Route::get/post/put/delete 分别对应 HTTP 方法。可以用闭包直接返回响应,也可以用控制器类。
php
<?php
// routes/web.php

Route::get("/", function () {
    return view("welcome");
});

Route::get("/users", [UserController::class, "index"]);
Route::get("/users/{id}", [UserController::class, "show"]);
Route::post("/users", [UserController::class, "store"]);

// 路由分组 + 中间件
Route::middleware(["auth"])->prefix("admin")->group(function () {
    Route::get("/dashboard", [AdminController::class, "index"]);
});

// 查看所有路由
// php artisan route:list
Route::resource 可以用一行代码生成 RESTful 的七个路由。

02. Eloquent ORM 操作

Eloquent 是 Laravel 自带的 ORM,每个数据库表对应一个 Model 类。一行 artisan 命令生成模型:php artisan make:model User。模型定义后,增删改查简单到令人发指。User::all() 查全部,User::find($id) 查一个,动态方法 User::where()->get() 条件查询。
php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model {
    protected $fillable = ["name", "email", "password"];
    
    // 关联
    public function posts() {
        return $this->hasMany(Post::class);
    }
}

// 使用
// 增
$user = User::create(["name" => "小明", "email" => "[email protected]", "password" => bcrypt("123456")]);

// 查
$users = User::where("age", ">", 18)->orderBy("name")->get();
$user = User::findOrFail(1);

// 改
$user->update(["name" => "新名字"]);

// 删
$user->delete();

// 关联查询
$userPosts = User::with("posts")->find(1);
$fillable 或 $guarded 必须设置一个,用来防止批量赋值漏洞。白名单比黑名单更安全。

03. Blade 模板

Blade 是 Laravel 的模板引擎,文件以 .blade.php 结尾。{{ }} 输出变量并自动转义防 XSS,{!! !!} 输出不转义的 HTML。@if/@foreach/@for 控制结构,@extends 模板继承,@section/@yield 定义和填充区块。@include 引入子模板,@csrf 生成 CSRF token。
php
{{-- layouts/app.blade.php --}}
<!DOCTYPE html>
<html>
<head><title>@yield("title")</title></head>
<body>
    @include("partials.header")
    <main>@yield("content")</main>
    @include("partials.footer")
</body>
</html>

{{-- users/index.blade.php --}}
@extends("layouts.app")

@section("title", "用户列表")

@section("content")
    <h1>用户列表</h1>
    @foreach ($users as $user)
        <p>{{ $user->name }} - {{ $user->email }}</p>
    @endforeach
    
    @auth
        <a href="/profile">个人中心</a>
    @endauth
    
    @guest
        <a href="/login">请登录</a>
    @endguest
@endsection
{{ }} 会自动转义 HTML 特殊字符防止 XSS,不需要手动 htmlspecialchars。

04. Artisan 命令行

Artisan 是 Laravel 强大的命令行工具,能做很多事:生成代码(make:model、make:controller)、数据库迁移(migrate)、数据填充(seed)、启动开发服务器(serve)、缓存清理(cache:clear)、进入交互式环境(tinker)。记不住的命令用 php artisan list 查看。
bash
# 创建模型(同时生成迁移和工厂)
php artisan make:model Post -mf

# 数据库迁移
php artisan migrate
php artisan migrate:rollback
php artisan migrate:refresh --seed

# 数据填充
php artisan make:seeder UserSeeder
php artisan db:seed

# 创建控制器
php artisan make:controller UserController --resource

# 缓存
php artisan config:cache
php artisan route:cache
php artisan view:cache

# 开发服务器
php artisan serve --port=8080

# 交互式 REPL
php artisan tinker
php artisan inspire 会随机显示一条鸡汤名言,给枯燥的开发加点乐子。

05. 请求验证和中间件

Form Request 是 Laravel 推荐的表单验证方式,把验证逻辑从控制器中抽离出来。rules 方法定义规则,messages 自定义错误消息。中间件是请求的过滤器,在进入控制器前执行。auth 中间件检查登录,throttle 限流,自定义中间件能做各种前置后置处理。
php
<?php
// Form Request
namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreUserRequest extends FormRequest {
    public function authorize(): bool {
        return true;
    }
    
    public function rules(): array {
        return [
            "name" => "required|string|max:50",
            "email" => "required|email|unique:users",
            "age" => "integer|min:1|max:150",
        ];
    }
    
    public function messages(): array {
        return [
            "name.required" => "用户名不能为空",
            "email.unique" => "该邮箱已注册",
        ];
    }
}

// 控制器中使用
public function store(StoreUserRequest $request) {
    // $request 已经验证通过
    User::create($request->validated());
    return redirect("/users")->with("success", "创建成功");
}
Form Request 验证失败会自动重定向回上一页并带上错误信息,控制器只处理验证通过的数据。

知识测验

1/4正确 0

Laravel 的路由文件在哪里定义?

下一节

安全实践

下一节