Laravel中的路由、控制器和Eloquent ORM基本用法详解
一、路由(Routing)
Laravel的路由系统是连接用户请求与应用程序逻辑的核心组件,支持灵活的定义方式和丰富的功能。
1.基本路由定义
路由定义在routes/web.php
(Web界面)和routes/api.php
(API接口)中,支持闭包或控制器方法绑定。例如:
// 闭包形式
Route::get('/hello', function () {
return 'Hello, World!';
});
// 绑定控制器方法
Route::get('/user', 'UserController@index');
支持常见的HTTP方法:get
、post
、put
、patch
、delete
、options
,以及match
(指定多个方法)和any
(响应所有方法)。
2.路由参数
动态参数通过{param}
语法捕获,支持必选、可选参数及正则约束:
// 必选参数
Route::get('/user/{id}', function ($id) { return "User ID: $id"; });
// 可选参数(需设置默认值)
Route::get('/user/{name?}', function ($name = 'Guest') { return "Hello, $name"; });
// 正则约束
Route::get('/user/{id}', function ($id) { ... })->where('id', '\d+');
参数验证可通过where
方法实现。
3.命名路由与URL生成
为路由命名便于生成URL或重定向:
Route::get('/dashboard', function () { ... })->name('dashboard');
// 生成URL
$url = route('dashboard');
// 重定向
return redirect()->route('dashboard');
命名需唯一,避免冲突。
4.路由组(Route Groups)
通过共享属性(如中间件、前缀、子域名)简化路由定义:
Route::prefix('admin')->middleware('auth')->group(function () {
Route::get('/users', 'AdminController@users'); // 实际路径:/admin/users
});
支持嵌套分组和子域名路由。
5.模型绑定(Route Model Binding)
自动将Eloquent模型实例注入路由参数:
Route::get('/user/{user}', function (User $user) { return $user->email; });
-
支持隐式绑定、自定义键及软删除模型查询。
二、控制器(Controllers)
控制器用于封装业务逻辑,遵循MVC模式,提升代码可维护性。
1.创建控制器
使用Artisan命令生成控制器文件:
php artisan make:controller UserController
添加--resource
参数可生成RESTful风格的方法(如index
、store
等)。
2.绑定路由到控制器
在路由文件中指定控制器方法:
Route::get('/users', 'UserController@index');
Route::post('/users', 'UserController@store');
支持直接绑定或通过资源路由(Route::resource
)自动映射。
3.资源控制器(Resource Controllers)
快速生成CRUD操作路由:
Route::resource('photos', 'PhotoController');
-
生成的路由包括:
- GET
/photos
→index
- GET
/photos/create
→create
- POST
/photos
→store
- GET
/photos/{photo}
→show
- 其他如
edit
、update
、destroy
等。
- GET
4.中间件与依赖注入
中间件可在控制器构造函数或路由中应用:
class UserController extends Controller {
public function __construct() {
$this->middleware('auth')->except('index');
}
}
-
支持通过构造函数或方法注入依赖(如Request、Repository)。
三、Eloquent ORM
Eloquent是Laravel的ActiveRecord实现,提供优雅的数据库操作接口。
1.模型定义与约定
模型类继承Illuminate\Database\Eloquent\Model
,默认表名为类名复数形式(如User
对应users
表):
class User extends Model {
protected $table = 'custom_users'; // 自定义表名
protected $primaryKey = 'user_id'; // 自定义主键
public $timestamps = false; // 禁用时间戳
}
使用Artisan命令生成模型及迁移文件:
php artisan make:model User -m
2.CRUD操作
查询:
$users = User::all(); // 获取所有记录
$user = User::find(1); // 通过主键查找
$activeUsers = User::where('status', 'active')->orderBy('name')->get();
插入:
$user = User::create(['name' => 'John', 'email' => 'john@example.com']);
// 或
$user = new User;
$user->name = 'John';
$user->save();
更新:
$user = User::find(1);
$user->update(['name' => 'Jane']);
删除:
User::destroy(1); // 通过主键删除
$user->delete(); // 删除实例
3.关系管理
Eloquent支持多种关系类型,通过方法定义:
一对一:
class User extends Model {
public function phone() {
return $this->hasOne(Phone::class);
}
}
一对多:
class Post extends Model {
public function comments() {
return $this->hasMany(Comment::class);
}
}
多对多:
class User extends Model {
public function roles() {
return $this->belongsToMany(Role::class);
}
}
支持hasOne
、hasMany
、belongsTo
、belongsToMany
及多态关系。
4.软删除与作用域
软删除:添加deleted_at
字段,模型中使用SoftDeletes
trait:
use Illuminate\Database\Eloquent\SoftDeletes;
class User extends Model {
use SoftDeletes;
}
删除时设置deleted_at
,查询默认排除软删除记录,可用withTrashed()
包含。
作用域:封装常用查询条件:
class User extends Model {
public function scopeActive($query) {
return $query->where('status', 'active');
}
}
// 使用作用域
$activeUsers = User::active()->get();
四、总结
- 路由:通过闭包或控制器方法处理请求,支持参数、分组、模型绑定等高级特性。
- 控制器:封装业务逻辑,支持资源路由、中间件和依赖注入,提升代码组织性。
- Eloquent ORM:以面向对象方式操作数据库,简化CRUD和关系管理,集成软删除、作用域等功能。
以上机制共同构成Laravel高效开发的核心,开发者可根据需求灵活组合使用,构建结构清晰、维护性强的Web应用。