PHP: 下一步:Laravel引路

恭喜你完成了 35 课 PHP 基础教程!你手写了路由器、控制器、视图、模型——这不就是一个小框架吗?Laravel 把这些做得优雅 10 倍。这节课是你从手写 PHP 到现代框架的桥梁。

1. 为什么需要框架?

你用 PHP 写的博客系统已经遇到这些问题了:

你的痛点 框架解决方案
URL 重写.htaccess 麻烦 Laravel 内置路由 Route::get('/posts', ...)
每个页面都要 session_start + 验证 中间件 ->middleware('auth')
SQL 手写容易错、切换数据库难 Eloquent ORM Post::all()
手动 require 所有文件 Composer 自动加载
表单 CSRF 保护自己写 @csrf 一行搞定
手动改来改去的数据库 Migrations 版本管理
密码哈希重复代码 Hash::make(), Auth::attempt()
💡 提示: 框架不是更复杂的 PHP——它是更组织化的 PHP。你手写过的每一个功能,在 Laravel 里都有更简洁的写法。


2. Laravel 安装

BASH
# 创建新项目
composer create-project laravel/laravel myblog

# 启动开发服务器
cd myblog
php artisan serve
# 打开 http://localhost:8000
TEXT 📖 仅展示
myblog/                          ← Laravel 项目
├── app/
│   ├── Models/                  ← Eloquent 模型
│   │   └── Post.php
│   └── Http/
│       └── Controllers/         ← 控制器
│           └── PostController.php
├── routes/
│   └── web.php                  ← 路由(核心!)
├── resources/
│   └── views/                   ← Blade 模板
│       └── posts/
├── database/
│   └── migrations/              ← 数据库迁移
├── .env                         ← 环境配置
└── artisan                      ← 命令行工具

3. 路由——你手写的 Router vs Laravel

(1) 你手写的:

PHP
$router->add('GET', '/posts', [$ctrl, 'index']);
$router->add('GET', '/posts/{id}', [$ctrl, 'show']);

(2) Laravel 的:

PHP
// routes/web.php
use App\Http\Controllers\PostController;

Route::get('/posts', [PostController::class, 'index']);
Route::get('/posts/{id}', [PostController::class, 'show']);

// 更简洁:资源路由(一行生成 7 个标准路由)
Route::resource('posts', PostController::class);

// 查看所有路由
// php artisan route:list

4. Eloquent ORM——你手写的 Model vs Laravel

(1) 你手写的:

PHP
// 30 行 CRUD 代码
public function getAll(): array { ... }
public function findById(int $id): ?array { ... }
public function create(...): int { ... }

(2) Laravel 的:

PHP
<?php
// app/Models/Post.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    // 就这一行!Laravel 自动映射到 posts 表
    protected $fillable = ['title', 'content', 'user_id'];
    
    // 关联用户
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

// 使用(10行手写代码 → 1行)
$posts = Post::all();
$post = Post::find(1);
Post::create(['title' => '你好', 'content' => '世界', 'user_id' => 1]);
$post->update(['title' => '新的标题']);
$post->delete();
// 关联查询
echo $post->user->username;  // 自动 JOIN users 表
?>

5. Blade 模板——你手写的 PHP View vs Blade

(1) 你手写的:

PHP
<?php foreach ($posts as $post): ?>
    <h2><?= htmlspecialchars($post['title']) ?></h2>
<?php endforeach; ?>

▶ 示例:Blade 文章列表模板

BLADE
{{-- resources/views/posts/index.blade.php --}}

@extends('layouts.app')

@section('content')
    <h2>文章列表</h2>
    
    @foreach ($posts as $post)
        <div class="post-card">
            <h2><a href="/posts/{{ $post->id }}">{{ $post->title }}</a></h2>
            <p>{{ Str::limit($post->content, 200) }}</p>
        </div>
    @endforeach
    
    {{-- 分页链接自动生成!--}}
    {{ $posts->links() }}
@endsection
▶ 试一试

Blade 特性:


6. Migrations——管理数据库结构

不再手动执行 SQL 建表,用代码定义表结构:

BASH
# 创建迁移文件
php artisan make:migration create_posts_table

# 执行迁移
php artisan migrate

# 回滚
php artisan migrate:rollback
PHP
<?php
// database/migrations/xxx_create_posts_table.php

return new class extends Migration
{
    public function up(): void
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->foreignId('user_id')->constrained()->onDelete('cascade');
            $table->string('title');
            $table->text('content');
            $table->timestamps();  // created_at + updated_at 自动管理
        });
    }

    public function down(): void
    {
        Schema::dropIfExists('posts');
    }
};
💡 提示: Migration 的好处:(1) 版本管理——像 Git 一样 php artisan migrate:rollback 回退;(2) 团队协作——所有人执行相同迁移得到相同表结构;(3) 自动处理字段名/类型/索引/外键。


7. 认证系统——手写 50 行 vs Laravel 3 行

(1) 你手写的:

PHP
// 验证密码 + Session 管理 + 退出登录 + 权限检查 = ~50 行

(2) Laravel 的:

BASH
# 一键生成完整认证系统(登录/注册/密码重置/邮箱验证)
composer require laravel/breeze
php artisan breeze:install blade
php artisan migrate
npm install && npm run build
PHP
// 路由保护
Route::get('/dashboard', function () {
    return view('dashboard');
})->middleware('auth');

// 获取当前用户
$user = auth()->user();
echo $user->posts;  // 自动关联查询

8. Artisan——你的 CLI 工具箱

BASH
# 创建控制器
php artisan make:controller PostController

# 创建模型(同时生成 Migration/Factory/Seeder)
php artisan make:model Post -a

# 数据库操作
php artisan migrate          # 执行迁移
php artisan db:seed          # 填充测试数据
php artisan migrate:fresh --seed  # 重置数据库 + 填充

# 调试
php artisan route:list       # 查看所有路由
php artisan tinker           # 交互式 PHP REPL(可直接操作数据库)

9. Laravel 博客系统——完整版

▶ 示例:完整 Laravel 控制器

PHP
<?php
// routes/web.php
use App\Http\Controllers\PostController;

Route::get('/', [PostController::class, 'index']);
Route::resource('posts', PostController::class)->middleware('auth');
Route::get('/register', [RegisteredUserController::class, 'create']);
Route::post('/register', [RegisteredUserController::class, 'store']);
▶ 试一试
PHP
<?php
// app/Http/Controllers/PostController.php
namespace App\Http\Controllers;

use App\Models\Post;
use Illuminate\Http\Request;

class PostController extends Controller
{
    public function index()
    {
        $posts = Post::with('user')->latest()->paginate(10);
        return view('posts.index', compact('posts'));
    }

    public function store(Request $request)
    {
        $validated = $request->validate([
            'title'   => 'required|max:200',
            'content' => 'required',
        ]);

        Post::create([
            ...$validated,
            'user_id' => auth()->id(),
        ]);

        return redirect('/posts')->with('success', '文章发布成功!');
    }
}

比较一下: 你手写的博客用了 ~150 行 PostController,Laravel 用了 ~20 行 —— 而且 Laravel 版自带防 SQL 注入、CSRF 保护、表单验证、分页。


10. 你的 PHP 学习路线图

TEXT 📖 仅展示
✅ 你已经完成:
   基础语法(变量/数组/函数/循环/条件)
         ↓
   Web 交互(表单/Cookie/Session/文件上传)      ← 36 课完成
         ↓
   OOP(类/继承/接口/Trait/命名空间/Composer)
         ↓
   数据库操作(MySQL/PDO/事务/安全)
         ↓
   PHP 8 现代特性(枚举/match/构造函数提升)
         ↓
🔜 你的下一步:
   
   1. 用 Laravel 重写博客系统(本周)
      — 理解框架思想,体验效率飞跃
   
   2. 学 REST API 开发
      — JSON 接口返回,前后端分离
   
   3. 了解测试(PHPUnit/Pest)
      — 让代码被自动测试保护
   
   4. 深入研究:
      — Laravel 生态(Eloquent/Queues/Events/Notifications)
      — 设计模式(Repository/Service/Factory)
      — 性能优化(Redis缓存/N+1查询/Opcache)

❓ 常见问题

Q 学完 PHP 基础必须立刻学 Laravel 吗?
A 不用焦虑。你已经理解了 MVC 是怎么工作的(因为你手写过)。这时学 Laravel 你会有"啊!原来这么简单"的顿悟。如果跳过手写直接学框架,很多底层原理就模糊了。
Q PHP 市场还有前途吗?
A WordPress 占全球 43% 网站,Laravel 是最受欢迎的 Web 框架之一。巴西、中东大量 PHP 岗位。PHP 8.x 每年发布新版本,速度快、类型系统完善、生态成熟。PHP 很活跃。
Q 下一个语言学什么?
A 你已经会 PHP(后端)+ HTML/CSS/JS(前端),你已经是一个全栈开发者了!深化方向:SQL 数据库(JOIN/索引/优化)→ 服务器管理(Nginx/Linux/Docker)→ 进阶 JavaScript(React/Vue)。

📖 小节

📝 作业

  1. 安装 Laravel,创建新项目,跑通 php artisan serve 看到欢迎页。
  2. php artisan make:model Post -a 创建完整的文章资源,编写 Migration 建表,用 Tinker 插入几条测试数据。
  3. 用 Laravel 重写你博客系统的文章列表页和文章详情页(Blade 模板 + Eloquent 查询),对比手写版体验不同。

🎉 恭喜你完成了 36 课 PHP 教程! 你从一个连 echo 都不会写的新手,变成了能用 PHP 构建完整 Web 应用、理解 MVC 架构、掌握数据库操作和安全的开发者。PHP 的世界很大——WordPress、Laravel、Drupal、Symfony 都在等着你。加油!🚀

Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏