编程

Laravel 中的 HTTP 方法验证

63 2025-02-18 11:50:00

Laravel 提供了直观的方法来处理传入请求中的 HTTP 动词,从而可以轻松处理应用程序中的不同类型操作。 method()isMethod() 方法提供了一种干净的方法来识别和验证请求类型。

当构建 RESTful API 或处理不同 HTTP 方法触发不同业务逻辑的复杂表单提交时,此功能变得特别有价值。它对于创建可以根据传入请求类型调整其行为的多功能控制器特别有用。

// Basic method checking
$method = $request->method();  // Returns 'GET', 'POST', etc.
if ($request->isMethod('post')) {
    // Handle POST request
}

以下是一个灵活的资源处理程序的示例:

<?php
 
namespace App\Http\Controllers;
 
use App\Models\Resource;
use Illuminate\Http\Request;
 
class ResourceController extends Controller
{
    public function handle(Request $request, $id = null)
    {
        return match($request->method()) {
            'GET' => $this->handleGet($id),
            'POST' => $this->handleCreate($request),
            'PUT' => $this->handleUpdate($request, $id),
            'DELETE' => $this->handleDelete($id),
            default => response()->json(['error' => 'Method not allowed'], 405)
        };
    }
 
    private function handleGet($id = null)
    {
        if ($id) {
            return Resource::with('metadata')
                ->findOrFail($id);
        }
        return Resource::with('metadata')
            ->latest()
            ->paginate(20);
    }
 
    private function handleCreate(Request $request)
    {
        $resource = Resource::create($request->validated());
 
        return response()->json([
            'message' => 'Resource created successfully',
            'resource' => $resource->load('metadata')
        ], 201);
    }
 
    private function handleUpdate(Request $request, $id)
    {
        $resource = Resource::findOrFail($id);
        $resource->update($request->validated());
        return response()->json([
            'message' => 'Resource updated successfully',
            'resource' => $resource->fresh()->load('metadata')
        ]);
    }
 
    private function handleDelete($id)
    {
        Resource::findOrFail($id)->delete();
 
        return response()->json(null, 204);
    }
}

交互示例:

// GET /api/resources/1
{
    "id": 1,
    "name": "Example Resource",
    "status": "active",
    "metadata": {
        "created_by": "john@example.com",
        "last_accessed": "2024-02-01T10:30:00Z"
    }
}
// PUT /api/resources/1 with invalid method
{
    "error": "Method not allowed"
}

method()isMethod() 方法提供了一种干净的方法来实现特定于方法的逻辑,同时保持代码的组织。