Laravel 快速入门:路由/控制器/视图

小飞兽 Laravel 7 次阅读 2026-07-29

Laravel 是 PHP 语言中最流行的 Web 框架,以优雅的语法、丰富的生态和强大的功能著称。本文带你快速入门 Laravel,掌握其核心架构。

路由基础

// routes/web.php
use Illuminate\Support\Facades\Route;

// 基本路由
Route::get("/", function () {
return "Hello World";
});

// 路由带参数
Route::get("user/{id}", function ($id) {
return "User ID: " . $id;
});

// 可选参数
Route::get("user/{name?}", function ($name = null) {
return $name ?? "Guest";
});

// 多个参数 + 类型约束
Route::get("post/{slug}/comment/{commentId}", function ($slug, $commentId) {
return "Post: $slug, Comment: $commentId";
})->where(["slug" => "[a-z0-9-]+", "commentId" => "[0-9]+"]);

// 路由命名
Route::get("dashboard", function () {
return view("dashboard");
})->name("dashboard");

// 路由群组
Route::prefix("admin")->name("admin.")->middleware("auth")->group(function () {
Route::get("users", function () { })->name("users.index");
Route::get("users/create", function () { })->name("users.create");
});

// API 路由(在 routes/api.php 中,自动加 /api 前缀)
Route::get("articles", [ArticleController::class, "index"])->name("articles.index");

控制器

// app/Http/Controllers/ArticleController.php
namespace App\Http\Controllers;

use App\Models\Article;
use App\Http\Requests\ArticleRequest;
use Illuminate\Http\Request;

class ArticleController extends Controller
{
public function index(Request $request)
{
$query = Article::query();
if ($request->has("category")) {
$query->where("category_id", $request->category);
}
if ($request->has("search")) {
$query->where("title", "like", "%" . $request->search . "%");
}
$articles = $query->orderBy("created_at", "desc")->paginate(20);
return view("articles.index", compact("articles"));
}

public function show($slug)
{
$article = Article::where("slug", $slug)->firstOrFail();
$article->increment("views");
return view("articles.show", compact("article"));
}

public function create()
{
return view("articles.create");
}

public function store(ArticleRequest $request)
{
$data = $request->validated();
$data["user_id"] = auth()->id();
$article = Article::create($data);
return redirect()->route("articles.show", $article->slug)
->with("success", "文章创建成功");
}

public function edit(Article $article)
{
return view("articles.edit", compact("article"));
}

public function update(ArticleRequest $request, Article $article)
{
$article->update($request->validated());
return redirect()->route("articles.show", $article->slug)
->with("success", "文章更新成功");
}

public function destroy(Article $article)
{
$article->delete();
return redirect()->route("articles.index")
->with("success", "文章已删除");
}
}

Blade 模板引擎

{{-- resources/views/layouts/app.blade.php --}}



@yield("title", "我的博客")



@include("layouts.header")


@yield("content")

@include("layouts.footer")
@stack("scripts")

{{-- resources/views/articles/index.blade.php --}}
@extends("layouts.app")

@section("title", "文章列表")

@section("content")
@if(session("success"))

{{ session("success") }}

@endif

文章列表

@forelse($articles as $article)



slug) }}">
{{ $article->title }}


{{ Str::limit($article->content, 100) }}



浏览: {{ $article->views }}
发布于: {{ $article->created_at->diffForHumans() }}


@empty

暂无文章


@endforelse

{{ $articles->links() }}
@endsection

@push("scripts")

@endpush

路由与控制器绑定

// routes/web.php
use App\Http\Controllers\ArticleController;

// 方式1:传统方式
Route::get("articles", [ArticleController::class, "index"])->name("articles.index");
Route::get("articles/{slug}", [ArticleController::class, "show"])->name("articles.show");

// 方式2:Laravel 10+ 的属性路由(需在控制器中加 #[Route] 属性)
// 参见 Laravel RESTful API 开发 章节

// 隐式绑定:Laravel 自动根据 ID 解析模型
// Route::get("articles/{article}", [ArticleController::class, "show"])
// 会自动执行 Article::findOrFail($article)

// 显式绑定
Route::model("article", Article::class);
Route::get("articles/{article}", [ArticleController::class, "show"]);

Blade 常用语法

// 变量输出
{{ $name }} {{-- 转义输出 --}}
{!! $html !!} {{-- 非转义输出 --}}
{{ $name ?? "默认值" }} {{-- 空值合并 --}}
{{ isset($name) ? $name : "默认" }}

// 控制结构
@if($count > 0)
有 {{ $count }} 条消息
@elseif($count > 10)
消息很多
@else
没有消息
@endif

@unless(auth()->check())
登录
@endunless

@auth
欢迎, {{ auth()->user()->name }}
@endauth

@guest
登录
@endguest

@for($i = 0; $i < 10; $i++)

{{ $i }}


@endfor

@foreach($items as $item)

{{ $item->name }}


@endforeach

// 组件指令
@component("components.alert", ["type" => "error"])
@slot("title")
错误
@endslot
内容...
@endcomponent

常见问题

    • Q: Route::get 和 Route::post 的区别?
      A:HTTP 方法决定请求类型,GET 用于获取页面,POST 用于提交表单数据。Laravel 会自动验证 CSRF Token,拒绝不带 Token 的 POST 请求以防止跨站攻击。
    • Q: Blade 的 {{ $var }} 和 {!! $var !!} 有什么区别?
      A:{{ }} 会对内容进行 HTML 转义,防止 XSS 攻击;{!! !!} 不转义,仅在你确信内容安全时才使用(如富文本编辑器已转义过的 HTML)。
    • Q: 控制器方法中返回 view() 和 redirect() 的区别?
      A:view() 渲染模板并返回 HTML 页面;redirect() 返回 302 重定向,让浏览器跳转到其他 URL。redirect()->with() 可以传递一次性 session 数据。
    • Q: {{ $articles->links() }} 为什么不显示分页?
      A:paginate() 返回的是 LengthAwarePaginator 对象,必须在 Blade 中用 ->links() 渲染,而 first() / get() 返回普通集合不支持分页。

    延伸阅读

  • Laravel Blade 官方文档
  • Laravel vs Django:两大 Web 框架全面对比