首页 > 解决方案 > 在 Laravel 中创建通用控制器时如何保持 DRY?

问题描述

当我在开发我的 Laravel 应用程序时,我注意到我正在创建非常相似的控制器方法。例如,我有模型:任务、块、课程等。在每个控制器中都有非常相似的方法:

public function index()
{
    return new GeneralResource(/model/::all());
}

public function show(/model/ $model)
{
    return new GeneralResource($model);
}

public function store(/model/Request $request)
{
    try {
        $model = /model/::create($request->validated());
        return response()->json(['status' => 'success']);
    } catch (\Exception $e) {
        echo $e->getMessage();
    }
}

public function update(/model/Request $request, /model/ $model)
{
    try {
        $model->update($request->validated());
        return response()->json(['status' => 'success']);
    } catch (\Exception $e) {
        echo $e->getMessage();
    }
}

public function destroy(/model/ $model)
{
    try {
        $model->delete();
        return response()->json(['status' => 'success']);
    } catch (\Exception $e) {
        echo $e->getMessage();
    }
}

也许我可以使用这些方法扩展 Controller 类并将参数作为受保护的属性传递,但我不确定如何做到这一点。

请帮忙。

标签: phplaraveloopdry

解决方案


您正在寻找的是所谓的模板方法。您可以为控制器中的每种方法执行此操作:)

更多信息:

https://refactoring.guru/design-patterns/template-method/php/example https://designpatternsphp.readthedocs.io/en/latest/Behavioral/TemplateMethod/README.html


推荐阅读