📜  laravel 中的控制器类型 - PHP (1)

📅  最后修改于: 2023-12-03 14:43:46.463000             🧑  作者: Mango

Laravel 中的控制器类型 - PHP

在 Laravel 中,控制器是 MVC(Model-View-Controller)结构中的一个组件,主要用于处理请求和响应。控制器负责从视图接收输入,处理业务逻辑,然后将响应发送回视图。在 Laravel 中,有多种类型的控制器可供选择,让我们来一一了解一下。

普通控制器

普通控制器是最常用的控制器类型。可以使用 Artisan 命令生成一个普通控制器,或者手动创建一个类并继承基类 App\Http\Controllers\Controller

php artisan make:controller MyController

控制器中的方法负责处理请求,并返回响应。一般情况下,返回一个视图或 JSON 响应。

class MyController extends Controller
{
    public function index()
    {
        return view('my_view');
    }

    public function store(Request $request)
    {
        // 处理请求
        return response()->json(['message' => 'ok']);
    }
}
资源控制器

资源控制器是基于 RESTful 架构的控制器类型。使用 Artisan 命令生成一个资源控制器,或者手动创建一个类并继承基类 Illuminate\Routing\Controller

php artisan make:controller PhotoController --resource

资源控制器中的方法根据 RESTful 架构中的规则来设置。例如,index() 方法获取所有资源列表,create() 方法返回视图以创建一个新资源,store() 方法创建一个新资源,show($id) 方法获取指定的资源,等等。

class PhotoController extends Controller
{
    public function index()
    {
        $photos = Photo::all();
        return view('photos.index', ['photos' => $photos]);
    }

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

    public function store(Request $request)
    {
        // 处理创建请求
    }

    public function show($id)
    {
        $photo = Photo::findOrFail($id);
        return view('photos.show', ['photo' => $photo]);
    }

    // ...
}

通过使用 RESTful 架构,资源控制器可以更好地组织和管理路由和请求,提高代码可读性和可维护性。

API 资源控制器

API 资源控制器是专门为 API 开发设计的控制器类型。与普通控制器和资源控制器不同,API 资源控制器主要生成 JSON 响应,而不是渲染视图。可以使用 Artisan 命令生成一个 API 资源控制器,或者手动创建一个类并继承 Illuminate\Routing\Controller

php artisan make:controller Api/PhotoController --api

相比于资源控制器,API 资源控制器中没有视图相关代码,只有数据处理和 JSON 响应的代码。

class PhotoController extends Controller
{
    public function index()
    {
        $photos = Photo::all();
        return response()->json(['photos' => $photos]);
    }

    public function store(Request $request)
    {
        // 处理创建请求
        return response()->json(['message' => 'ok'], 201);
    }

    public function show($id)
    {
        $photo = Photo::findOrFail($id);
        return response()->json(['photo' => $photo]);
    }

    // ...
}
带操作日志的控制器

在某些情况下,我们需要记录用户的操作行为,便于后续的审计和监控。关于操作日志的记录,可以通过自定义控制器类型来完成。

class LoggableController extends Controller
{
    protected $logModels = [];

    public function __construct()
    {
        $this->middleware(function ($request, $next) {
            $response = $next($request);
            $this->log($request, $response);
            return $response;
        });
    }

    protected function log(Request $request, $response)
    {
        foreach ($this->logModels as $model) {
            $model->create([
                'user_id' => $request->user()->id,
                'path' => $request->path(),
                'method' => $request->method(),
                'response' => $response->content(),
            ]);
        }
    }
}

这个控制器类型使用中间件实现了请求和响应的记录。在使用时,需要在控制器中设置 $logModels 属性,指定需要记录的模型。

class MyController extends LoggableController
{
    protected $logModels = [Log::class];

    // ...
}
总结

Laravel 中的控制器类型包括普通控制器、资源控制器、API 资源控制器和自定义控制器。每个类型的控制器都有各自的特点和应用场景,需要结合实际情况选择适合的控制器类型。