在Laravel中重构重复的控制器方法

时间:2018-11-28 19:37:59

标签: laravel model refactoring laravel-controller

我对Laravel中的代码有些困惑。我的成员可以订阅一个或多个课程。我有三个表:成员,课程和lesson_member。

我创建了一个成员表单,然后可以从该表单中在课程中注册该成员(我需要获取课程ID,并将记录放入数据透视表中。)

然后我有了课程表;我可以创建一个新课程并放入一个或多个成员中(在这种情况下,我需要成员代码)。 这两个功能几乎相同,但参数不同。在我的解决方案中,我创建了两个具有两个不同功能的不同控制器。

LessonController

<?php

public function addMember(Request $request)
{
    $lessonMember = new LessonMember();
    $lessonId = $request->session()->get('lessonId', 1);

    if ((!($lessonMember::where('lesson_id', '=', $lessonId)
        ->where('license_member_id', '=', $request->memberId)
        ->exists()))) {
        $lessonMember->lesson_id = $lessonId;
        $lessonMember->license_member_id = $request->memberId;
        $lessonMember->save();
        $member = LicenseMember::find($request->memberId)->member;

        return response()->json(['user_saved' => $member, 'llm' => $lessonMember, 'actualMembers' => $actualMembers]);
    }
}

MemberController

<?php

public function addLesson(Request $request)
{
    $lessonMember = new LessonMember();
    $memberId = $request->session()->get('memberId', 1);

    if ((!($lessonMember::where('lesson_id', $request->lessonId)
        ->where('license_member_id', $memberId)
        ->exists()))) {
        $lessonMember->lesson_id = $request->lessonId;
        $lessonMember->license_member_id = $memberId;
        $lessonMember->save();
        $member = LicenseMember::find($memberId)->member;

        return response()->json(['user_saved' => $member, 'llm' => $lessonMember]);
    }
}

removeFromLesson()方法和updateLessonMember方法都存在相同的问题,但是解决方案应该相似。可以肯定的是,它不是DRY,我想我必须在模型中(或其他地方)放置一些代码,但是我不知道该如何进行。我想重构以得到一个干净的解决方案。我读过有关特质的文章,但我不知道这是否是正确的方法。

1 个答案:

答案 0 :(得分:0)

LessonControllerMemberController扩展了BaseController

在该基本控制器内,创建一个名为add_lesson_member的函数(您可以根据需要调用它)

然后,您只需要在LessonController或MemberController中使用$this->add_lesson_member()来调用此函数。