MVC(Model-View-Controller)架构中,Controller控制器的作用

在 MVC(Model-View-Controller)架构中,C(Controller,控制器) 是负责处理用户输入、调用模型(Model)和视图(View)的组件。它是用户与系统之间的中间层,主要职责是接收用户请求、处理请求数据、调用相应的业务逻辑,并将处理结果返回给用户。

控制器(Controller)的具体内容和职责

  1. 接收用户请求

    • 控制器监听特定的路由或端点,接收用户的 HTTP 请求(如 GET、POST、PUT、DELETE 等)。

    • 在 FastAPI 中,控制器通常通过装饰器(如 @router.get@router.post)来定义路由和处理函数。

    from fastapi import APIRouter
    
    router = APIRouter()
    
    @router.get("/users")
    async def get_users():
        # 处理获取用户列表的逻辑
        pass
    
  2. 验证和解析请求数据

    • 控制器对请求的数据进行验证,确保数据格式正确且符合业务要求。

    • 可以使用 Pydantic 模型来定义请求数据的结构和验证规则。

    from pydantic import BaseModel
    from fastapi import HTTPException
    
    class UserCreate(BaseModel):
        username: str
        password: str
        email: str
    
    @router.post("/users")
    async def create_user(user_data: UserCreate):
        if not user_data.username:
            raise HTTPException(status_code=400, detail="Username is required")
        # 处理创建用户的逻辑
    
  3. 调用模型(Model)或服务层(Service Layer)

    • 控制器调用模型或服务层来执行具体的业务逻辑,如数据查询、数据更新等。

    • 模型负责与数据库交互,服务层包含业务逻辑。

    from app.models import User
    from app.services import user_service
    
    @router.get("/users/{user_id}")
    async def get_user(user_id: int):
        user = await user_service.get_user_by_id(user_id)
        if not user:
            raise HTTPException(status_code=404, detail="User not found")
        return user
    
  4. 返回响应

    • 控制器将处理结果整理成合适的格式(如 JSON),返回给用户。

    • 可以直接返回数据,也可以返回自定义的响应对象。

    @router.post("/users")
    async def create_user(user_data: UserCreate):
        user = await user_service.create_user(user_data)
        return {"status": "success", "data": user}
    
  5. 处理异常和错误

    • 控制器负责捕获和处理异常,返回适当的错误信息给用户。

    from fastapi import HTTPException
    
    @router.get("/users/{user_id}")
    async def get_user(user_id: int):
        try:
            user = await user_service.get_user_by_id(user_id)
            if not user:
                raise HTTPException(status_code=404, detail="User not found")
            return user
        except Exception as e:
            raise HTTPException(status_code=500, detail=str(e))
    

控制器的代码结构示例

以下是一个典型的控制器代码结构示例:

# app/controllers/user.py

from fastapi import APIRouter, HTTPException
from pydantic import BaseModel
from app.models import User
from app.services import user_service

router = APIRouter()

class UserCreate(BaseModel):
    username: str
    password: str
    email: str

class UserUpdate(BaseModel):
    username: str
    email: str

@router.get("/users")
async def get_users():
    users = await user_service.get_all_users()
    return users

@router.get("/users/{user_id}")
async def get_user(user_id: int):
    user = await user_service.get_user_by_id(user_id)
    if not user:
        raise HTTPException(status_code=404, detail="User not found")
    return user

@router.post("/users")
async def create_user(user_data: UserCreate):
    user = await user_service.create_user(user_data)
    return {"status": "success", "data": user}

@router.put("/users/{user_id}")
async def update_user(user_id: int, user_data: UserUpdate):
    user = await user_service.update_user(user_id, user_data)
    if not user:
        raise HTTPException(status_code=404, detail="User not found")
    return {"status": "success", "data": user}

@router.delete("/users/{user_id}")
async def delete_user(user_id: int):
    success = await user_service.delete_user(user_id)
    if not success:
        raise HTTPException(status_code=404, detail="User not found")
    return {"status": "success", "message": "User deleted successfully"}

总结

在 MVC 架构中,控制器(Controller)的主要职责是:

  1. 接收用户请求。

  2. 验证和解析请求数据。

  3. 调用模型或服务层来处理业务逻辑。

  4. 返回处理结果给用户。

  5. 处理异常和错误。

控制器是用户与系统之间的桥梁,它协调了用户请求和后端业务逻辑的处理,确保了请求能够被正确地处理并返回相应的结果。

你可能感兴趣的:(mvc,架构)