Laravel 是什么:PHP 的工程化框架
PHP 早年是"一个 PHP 文件一段脚本",混着 HTML 和 SQL。Laravel 把它拉到现代 Web 工程的水准:目录结构分好、路由注册集中、数据库操作用 ORM、视图用模板引擎。你写的不再是零散脚本,而是一个有模有样的 MVC 工程。
Laravel 的口号是"开发者体验优先":常用的事情一条命令搞定,重复的事情框架替你做。它在 PHP 生态里是事实上的主流框架,做后台、CMS、中小企业 Web 系统都很常见。
Laravel 的本质:把 PHP 的灵活,套上一层有规矩的工程外壳——既保留 PHP 的快速迭代,又有大型框架的结构。
- composerPHP 的包管理,装 Laravel 和依赖。
- artisan命令行工具,起项目、建表、跑迁移都靠它。
- 路由+控制器URL 在哪注册、请求交给哪个类处理。
- EloquentORM,用 PHP 对象操作数据库,不用手写 SQL。
一条命令起项目:composer 与 artisan
装 Laravel 用 composer(PHP 的包管理器)。一行命令就能拉一个全新项目下来:
composer create-project laravel/laravel my-blog
cd my-blog
php artisan serve # 起本地开发服务器
artisan 是 Laravel 自带的命令行工具,后面建控制器、建模型、跑迁移都靠它。项目骨架已经分好:app 写业务、routes 写路由、database 放迁移和种子、resources/views 放 Blade 模板。
路由与控制器:URL 怎么映射到代码
所有 URL 都在 routes/web.php 里注册。一个 URL 对应一个闭包或一个控制器方法。
// routes/web.php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\PostController;
Route::get('/posts', [PostController::class, 'index']);
Route::get('/posts/{id}', [PostController::class, 'show']);
控制器就是一个普通 PHP 类,方法接收请求、返回响应:
namespace App\Http\Controllers;
use App\Models\Post;
class PostController extends Controller {
public function index() {
$posts = Post::all();
return view('posts.index', compact('posts'));
}
}
URL 进来 → 路由匹配 → 控制器方法 → 拿数据 → 渲染视图。这就是 MVC 的标准流程。
Eloquent ORM:用对象操作数据库
Eloquent 是 Laravel 的 ORM:一张数据库表对应一个 PHP 模型类,表的一行就是模型的一个实例。你不用手写 SQL,用方法链就能查。
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Post extends Model {
// 对应 posts 表
}
// 用法
$post = Post::find(1); // 查 id=1
$posts = Post::where('status', 1)
->orderBy('created_at','desc')
->get(); // 条件查
$p = new Post();
$p->title = '新文章';
$p->save(); // 插入
从 Post::all() 到 $p->save(),你操作的是 PHP 对象,Eloquent 在背后翻译成 SQL。表字段变化?改模型和迁移就行,不用改业务代码。
迁移:把表结构当代码管
过去改表结构是手动进 phpMyAdmin 点。Laravel 用迁移(migration)把表结构写成 PHP 文件,跟着 git 走——团队每个人跑一遍 migrate,表就建好了。
php artisan make:migration create_posts_table
// 生成的迁移文件里
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('body');
$table->timestamps();
});
php artisan migrate // 真正建表
迁移的好处:表结构变更有版本、可回滚、团队一致。再也不会出现"我本地表和你不一样"的尴尬。
Blade 视图:服务端模板
视图用 Blade 模板写:在 HTML 里插 {{ }} 输出变量、@foreach 循环、@if 判断。它最后被编译成纯 PHP,性能不打折。
<!-- resources/views/posts/index.blade.php -->
<h1>文章列表</h1>
@foreach ($posts as $p)
<article>
<h2>{{ $p->title }}</h2>
<p>{{ $p->created_at->format('Y-m-d') }}</p>
</article>
@endforeach
控制器把 $posts 传进来,Blade 把它渲染成 HTML 发给浏览器。前后端在这一层握手。
实战:做一个文章 CRUD
串起来:建迁移建 posts 表、建 Post 模型、建 PostController 五个方法(列表/详情/新建/保存/删除)、注册路由、写 Blade 视图。这就是一个完整的后台文章管理。
// 路由
Route::resource('posts', PostController::class);
// 上面这一行自动注册 index/create/store/show/edit/update/destroy 七条路由
// 控制器里 store 方法
public function store(Request $request) {
$data = $request->validate([
'title' => 'required|max:255',
'body' => 'required',
]);
Post::create($data);
return redirect('/posts');
}
Route::resource 一行注册全套 RESTful 路由,validate 一行做参数校验——Laravel 把重复的活都替你做了。这就是它"开发者体验优先"的实际体感。
Laravel 检查清单
把 Laravel 记成一条链:composer 起项目 → routes 注册 URL → 控制器处理 → Eloquent 取数据 → Blade 渲染视图 → 迁移管表结构。提交前对照自查:
- 路由是不是集中在 routes/ 里,没有散落在各个 PHP 文件顶部?
- 数据库操作是不是走 Eloquent,没有到处手写 SQL 拼接?
- 表结构变更是不是写了迁移文件,而不是手动改数据库?
- 用户输入是不是经过了 validate 校验,没直接塞进数据库?
- 敏感配置(数据库密码、API key)是不是放在 .env 里,没硬编码?
Laravel 的哲学:约定优于配置。目录结构、命名、路由约定都给你定好,你只管写业务——把重复的事情交给框架,把精力留给真正的产品逻辑。
下一篇我们换个方向:看看 Julia——一门为科学计算而生、跑得像 C 一样快的动态语言,是怎么在 Python 和 MATLAB 中间切出一块地的。