资源控制器 #

一、RESTful概述 #

1.1 什么是RESTful #

RESTful是一种软件架构风格,用于设计网络应用程序的API。它使用HTTP动词来表示操作类型。

text
RESTful设计原则
├── 使用HTTP动词表示操作
│   ├── GET - 获取资源
│   ├── POST - 创建资源
│   ├── PUT/PATCH - 更新资源
│   └── DELETE - 删除资源
├── 使用名词表示资源
│   ├── /users - 用户资源
│   ├── /posts - 文章资源
│   └── /comments - 评论资源
└── 使用HTTP状态码表示结果
    ├── 200 - 成功
    ├── 201 - 创建成功
    ├── 404 - 未找到
    └── 500 - 服务器错误

1.2 RESTful路由设计 #

HTTP方法 URI 操作 说明
GET /users index 获取用户列表
GET /users/create create 显示创建表单
POST /users store 保存新用户
GET /users/ show 显示单个用户
GET /users/{id}/edit edit 显示编辑表单
PUT/PATCH /users/ update 更新用户
DELETE /users/ destroy 删除用户

二、创建资源控制器 #

2.1 创建命令 #

bash
php artisan make:controller UserController --resource

2.2 生成的控制器 #

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

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

class UserController extends Controller
{
    public function index()
    {
        $users = User::all();
        return view('users.index', compact('users'));
    }

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

    public function store(Request $request)
    {
        $validated = $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|email|unique:users',
            'password' => 'required|min:8',
        ]);

        $user = User::create($validated);

        return redirect()->route('users.show', $user)
            ->with('success', '用户创建成功');
    }

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

    public function edit(User $user)
    {
        return view('users.edit', compact('user'));
    }

    public function update(Request $request, User $user)
    {
        $validated = $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|email|unique:users,email,' . $user->id,
        ]);

        $user->update($validated);

        return redirect()->route('users.show', $user)
            ->with('success', '用户更新成功');
    }

    public function destroy(User $user)
    {
        $user->delete();

        return redirect()->route('users.index')
            ->with('success', '用户删除成功');
    }
}

三、资源路由 #

3.1 定义资源路由 #

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

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

3.2 生成的路由列表 #

bash
php artisan route:list --path=users

输出:

text
+----------+------------------------+-----------------+------------------------+
| Method   | URI                    | Name            | Action                 |
+----------+------------------------+-----------------+------------------------+
| GET      | users                  | users.index     | UserController@index   |
| GET      | users/create           | users.create    | UserController@create  |
| POST     | users                  | users.store     | UserController@store   |
| GET      | users/{user}           | users.show      | UserController@show    |
| GET      | users/{user}/edit      | users.edit      | UserController@edit    |
| PUT      | users/{user}           | users.update    | UserController@update  |
| PATCH    | users/{user}           | users.update    | UserController@update  |
| DELETE   | users/{user}           | users.destroy   | UserController@destroy |
+----------+------------------------+-----------------+------------------------+

3.3 部分资源路由 #

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

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

3.4 资源路由命名 #

php
Route::resource('users', UserController::class)->names([
    'index' => 'users.list',
    'show' => 'users.detail',
]);

3.5 资源路由参数 #

php
Route::resource('users', UserController::class)->parameters([
    'users' => 'user_id',
]);

四、API资源控制器 #

4.1 创建API资源控制器 #

bash
php artisan make:controller UserController --api

4.2 API资源控制器结构 #

php
class UserController extends Controller
{
    public function index()
    {
        return User::all();
    }

    public function store(Request $request)
    {
        $user = User::create($request->validated());
        return response()->json($user, 201);
    }

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

    public function update(Request $request, User $user)
    {
        $user->update($request->validated());
        return response()->json($user);
    }

    public function destroy(User $user)
    {
        $user->delete();
        return response()->json(null, 204);
    }
}

4.3 API资源路由 #

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

生成的路由:

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

4.4 批量API资源 #

php
Route::apiResources([
    'users' => UserController::class,
    'posts' => PostController::class,
    'comments' => CommentController::class,
]);

五、嵌套资源 #

5.1 嵌套资源路由 #

php
// 用户下的文章
Route::resource('users.posts', PostController::class);

生成的路由:

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

5.2 嵌套控制器 #

php
class PostController extends Controller
{
    public function index(User $user)
    {
        return $user->posts;
    }

    public function show(User $user, Post $post)
    {
        return $post;
    }

    public function store(Request $request, User $user)
    {
        $post = $user->posts()->create($request->validated());
        return redirect()->route('users.posts.show', [$user, $post]);
    }
}

5.3 浅层嵌套 #

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

生成的路由:

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

六、资源模型绑定 #

6.1 创建带模型的资源控制器 #

bash
php artisan make:controller UserController --resource --model=User

6.2 生成的控制器 #

php
class UserController extends Controller
{
    public function show(User $user)
    {
        return view('users.show', compact('user'));
    }

    public function edit(User $user)
    {
        return view('users.edit', compact('user'));
    }

    public function update(Request $request, User $user)
    {
        $user->update($request->validated());
        return redirect()->route('users.show', $user);
    }

    public function destroy(User $user)
    {
        $user->delete();
        return redirect()->route('users.index');
    }
}

七、资源控制器中间件 #

7.1 资源路由中间件 #

php
Route::resource('users', UserController::class)
    ->middleware(['auth', 'verified']);

7.2 控制器构造函数 #

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

八、完整示例 #

8.1 创建控制器 #

bash
php artisan make:controller PostController --resource --model=Post

8.2 完整控制器实现 #

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

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

class PostController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth')->except(['index', 'show']);
    }

    public function index()
    {
        $posts = Post::with('user')
            ->published()
            ->latest()
            ->paginate(10);

        return view('posts.index', compact('posts'));
    }

    public function create()
    {
        return view('posts.create');
    }

    public function store(Request $request)
    {
        $validated = $request->validate([
            'title' => 'required|string|max:255',
            'content' => 'required|string',
            'status' => 'required|in:draft,published',
        ]);

        $post = auth()->user()->posts()->create($validated);

        return redirect()->route('posts.show', $post)
            ->with('success', '文章创建成功');
    }

    public function show(Post $post)
    {
        $post->load(['user', 'comments.user']);
        
        return view('posts.show', compact('post'));
    }

    public function edit(Post $post)
    {
        $this->authorize('update', $post);
        
        return view('posts.edit', compact('post'));
    }

    public function update(Request $request, Post $post)
    {
        $this->authorize('update', $post);

        $validated = $request->validate([
            'title' => 'required|string|max:255',
            'content' => 'required|string',
            'status' => 'required|in:draft,published',
        ]);

        $post->update($validated);

        return redirect()->route('posts.show', $post)
            ->with('success', '文章更新成功');
    }

    public function destroy(Post $post)
    {
        $this->authorize('delete', $post);

        $post->delete();

        return redirect()->route('posts.index')
            ->with('success', '文章删除成功');
    }
}

8.3 路由定义 #

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

Route::resource('posts', PostController::class);

九、资源控制器最佳实践 #

9.1 使用表单请求 #

php
// 创建表单请求
php artisan make:request StorePostRequest

// 表单请求类
class StorePostRequest extends FormRequest
{
    public function rules()
    {
        return [
            'title' => 'required|string|max:255',
            'content' => 'required|string',
            'status' => 'required|in:draft,published',
        ];
    }
}

// 控制器中使用
public function store(StorePostRequest $request)
{
    $post = auth()->user()->posts()->create($request->validated());
    return redirect()->route('posts.show', $post);
}

9.2 使用API资源 #

php
// 创建API资源
php artisan make:resource UserResource

// 资源类
class UserResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'email' => $this->email,
            'created_at' => $this->created_at->toIso8601String(),
        ];
    }
}

// 控制器中使用
public function index()
{
    $users = User::paginate(10);
    return UserResource::collection($users);
}

9.3 使用策略授权 #

php
// 创建策略
php artisan make:policy PostPolicy --model=Post

// 策略类
class PostPolicy
{
    public function update(User $user, Post $post)
    {
        return $user->id === $post->user_id;
    }

    public function delete(User $user, Post $post)
    {
        return $user->id === $post->user_id || $user->isAdmin();
    }
}

// 控制器中使用
public function update(Request $request, Post $post)
{
    $this->authorize('update', $post);
    // ...
}

十、总结 #

10.1 核心要点 #

要点 命令/方法
创建资源控制器 php artisan make:controller X --resource
定义资源路由 Route::resource('users', UserController::class)
API资源路由 Route::apiResource('users', UserController::class)
部分资源 only() / except()
嵌套资源 Route::resource('users.posts', ...)

10.2 下一步 #

掌握了资源控制器后,让我们继续学习 依赖注入,了解Laravel强大的IoC容器!

最后更新:2026-03-28