控制器基础 #

一、控制器概述 #

1.1 什么是控制器 #

控制器是MVC架构中的C,负责处理用户请求、调用业务逻辑并返回响应。

text
请求处理流程
┌─────────────┐
│  用户请求    │
└──────┬──────┘
       │
       ▼
┌─────────────┐
│   路由      │
└──────┬──────┘
       │
       ▼
┌─────────────┐
│  控制器      │
│  处理请求    │
└──────┬──────┘
       │
       ▼
┌─────────────┐
│  返回响应    │
└─────────────┘

1.2 控制器位置 #

控制器存放在 app/Http/Controllers 目录下。

二、创建控制器 #

2.1 使用Artisan命令 #

bash
# 创建基础控制器
php artisan make:controller UserController

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

# 创建API资源控制器
php artisan make:controller UserController --api

# 创建单动作控制器
php artisan make:controller ShowProfile --invokable

# 指定模型
php artisan make:controller UserController --model=User

2.2 控制器结构 #

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

use Illuminate\Http\Request;

class UserController extends Controller
{
    public function index()
    {
        return '用户列表';
    }
}

2.3 基础控制器 #

Laravel提供了一个基础控制器 App\Http\Controllers\Controller

php
namespace App\Http\Controllers;

use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;

class Controller extends BaseController
{
    use AuthorizesRequests, ValidatesRequests;
}

三、定义路由 #

3.1 基本路由 #

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

Route::get('/users', [UserController::class, 'index']);

3.2 多个路由 #

php
Route::get('/users', [UserController::class, 'index']);
Route::get('/users/{id}', [UserController::class, 'show']);
Route::post('/users', [UserController::class, 'store']);
Route::put('/users/{id}', [UserController::class, 'update']);
Route::delete('/users/{id}', [UserController::class, 'destroy']);

3.3 控制器路由组 #

php
Route::controller(UserController::class)->group(function () {
    Route::get('/users', 'index');
    Route::get('/users/{id}', 'show');
    Route::post('/users', 'store');
});

四、控制器方法 #

4.1 接收参数 #

php
class UserController extends Controller
{
    public function show($id)
    {
        return "用户ID: {$id}";
    }
    
    public function posts($userId, $postId)
    {
        return "用户 {$userId} 的文章 {$postId}";
    }
}

4.2 类型提示参数 #

php
use App\Models\User;

class UserController extends Controller
{
    public function show(User $user)
    {
        return $user;
    }
}

4.3 接收Request对象 #

php
use Illuminate\Http\Request;

class UserController extends Controller
{
    public function store(Request $request)
    {
        $name = $request->input('name');
        $email = $request->input('email');
        
        return response()->json([
            'name' => $name,
            'email' => $email,
        ]);
    }
}

4.4 依赖注入 #

php
use App\Services\UserService;

class UserController extends Controller
{
    protected $userService;
    
    public function __construct(UserService $userService)
    {
        $this->userService = $userService;
    }
    
    public function index()
    {
        $users = $this->userService->getAll();
        return view('users.index', compact('users'));
    }
}

五、返回响应 #

5.1 返回字符串 #

php
public function index()
{
    return 'Hello, Laravel!';
}

5.2 返回数组 #

php
public function index()
{
    return ['name' => 'John', 'email' => 'john@example.com'];
}

5.3 返回视图 #

php
public function index()
{
    return view('users.index');
}

public function show($id)
{
    $user = User::find($id);
    return view('users.show', compact('user'));
}

5.4 返回JSON响应 #

php
public function api()
{
    return response()->json([
        'status' => 'success',
        'data' => ['name' => 'John'],
    ]);
}

5.5 返回重定向 #

php
public function store()
{
    return redirect('/users');
}

public function update($id)
{
    return redirect()->route('users.show', $id);
}

public function back()
{
    return back();
}

public function home()
{
    return redirect()->home();
}

5.6 返回下载响应 #

php
public function download()
{
    return response()->download(public_path('file.pdf'));
}

public function downloadWithName()
{
    return response()->download(
        public_path('file.pdf'),
        'document.pdf'
    );
}

5.7 返回文件 #

php
public function file()
{
    return response()->file(public_path('image.jpg'));
}

六、单动作控制器 #

6.1 创建单动作控制器 #

bash
php artisan make:controller ShowProfile --invokable

6.2 实现__invoke方法 #

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

class ShowProfile
{
    public function __invoke($id)
    {
        return "用户 {$id} 的资料";
    }
}

6.3 路由定义 #

php
Route::get('/profile/{id}', ShowProfile::class);

七、控制器中间件 #

7.1 构造函数中定义 #

php
class UserController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
        
        $this->middleware('admin')->only(['create', 'store', 'destroy']);
        
        $this->middleware('verified')->except('index');
    }
}

7.2 闭包中间件 #

php
public function __construct()
{
    $this->middleware(function ($request, $next) {
        if ($request->user()->isAdmin()) {
            return $next($request);
        }
        abort(403);
    });
}

八、资源控制器 #

8.1 创建资源控制器 #

bash
php artisan make:controller UserController --resource

8.2 生成的控制器方法 #

php
class UserController extends Controller
{
    public function index()      // 列表
    public function create()     // 创建表单
    public function store()      // 保存
    public function show($id)    // 详情
    public function edit($id)    // 编辑表单
    public function update($id)  // 更新
    public function destroy($id) // 删除
}

8.3 资源路由 #

php
Route::resource('users', UserController::class);

生成的路由:

方法 URI 名称 动作
GET /users users.index index
GET /users/create users.create create
POST /users users.store store
GET /users/ users.show show
GET /users/{user}/edit users.edit edit
PUT/PATCH /users/ users.update update
DELETE /users/ users.destroy destroy

8.4 部分资源路由 #

php
// 只包含指定方法
Route::resource('users', UserController::class)->only([
    'index', 'show'
]);

// 排除指定方法
Route::resource('users', UserController::class)->except([
    'create', 'store', 'destroy'
]);

九、API资源控制器 #

9.1 创建API资源控制器 #

bash
php artisan make:controller UserController --api

9.2 生成的控制器方法 #

php
class UserController extends Controller
{
    public function index()      // 列表
    public function store()      // 保存
    public function show($id)    // 详情
    public function update($id)  // 更新
    public function destroy($id) // 删除
}

9.3 API资源路由 #

php
Route::apiResource('users', UserController::class);

十、嵌套资源 #

10.1 嵌套资源路由 #

php
Route::resource('users.posts', PostController::class);

生成的路由:

方法 URI 名称
GET /users/{user}/posts users.posts.index
GET /users/{user}/posts/ users.posts.show
POST /users/{user}/posts users.posts.store
PUT/PATCH /users/{user}/posts/ users.posts.update
DELETE /users/{user}/posts/ users.posts.destroy

10.2 浅层嵌套 #

php
Route::resource('users.posts', PostController::class)->shallow();

生成的路由:

方法 URI 名称
GET /users/{user}/posts users.posts.index
GET /posts/ posts.show
POST /users/{user}/posts users.posts.store
PUT/PATCH /posts/ posts.update
DELETE /posts/ posts.destroy

十一、控制器命名规范 #

11.1 命名约定 #

类型 命名规范 示例
控制器 PascalCase + Controller UserController
方法 camelCase index, show, store
资源 复数形式 users, posts

11.2 目录组织 #

text
app/Http/Controllers/
├── Controller.php
├── UserController.php
├── PostController.php
└── Admin/
    ├── DashboardController.php
    └── UserController.php

十二、最佳实践 #

12.1 保持控制器精简 #

php
// 不推荐:业务逻辑在控制器中
public function store(Request $request)
{
    $validated = $request->validate([
        'name' => 'required',
        'email' => 'required|email|unique:users',
    ]);
    
    $user = User::create($validated);
    
    Mail::to($user)->send(new WelcomeEmail($user));
    
    event(new UserRegistered($user));
    
    return redirect()->route('users.show', $user);
}

// 推荐:使用服务类
public function store(StoreUserRequest $request, UserService $userService)
{
    $user = $userService->create($request->validated());
    return redirect()->route('users.show', $user);
}

12.2 使用表单请求验证 #

php
// 控制器
public function store(StoreUserRequest $request)
{
    $user = User::create($request->validated());
    return redirect()->route('users.show', $user);
}

// 表单请求
class StoreUserRequest extends FormRequest
{
    public function rules()
    {
        return [
            'name' => 'required|string|max:255',
            'email' => 'required|email|unique:users',
        ];
    }
}

12.3 使用资源响应 #

php
public function index()
{
    $users = User::paginate(10);
    return UserResource::collection($users);
}

public function show(User $user)
{
    return new UserResource($user);
}

十三、总结 #

13.1 核心要点 #

要点 说明
创建 php artisan make:controller
路由 Route::get('/url', [Controller::class, 'method'])
响应 view、json、redirect、download
中间件 构造函数中定义
资源控制器 RESTful CRUD操作

13.2 下一步 #

掌握了控制器基础后,让我们继续学习 资源控制器,深入了解RESTful资源操作!

最后更新:2026-03-28