简体   繁体   中英

Cluttered Controllers in Laravel 5.1

Is there a better way of organizing or writing the below controller method in Laravel 5.1?

I want to keep my Controllers short and sweet. I am using a repository setup as i'm building quite a large application and I want to keep everything organised.

Please advise on the best way to organise the below code.

/**
 * Show the form for creating a new resource.
 *
 * @return Response
 */
public function create(CreateTimesheetRequest $request)
{
    $data                   = $request->only('user_id', 'template_id');
    $data['submitted_by']   = Auth::user()->id;

    $timesheetId = $this->timesheet->createTimesheet($data);

    foreach($request->get('row') as $key => $row)
    {
        foreach($row as $field => $value) 
        {
            $this->timesheet->saveTimesheetRows([
                'timesheet_id'  => $timesheetId,
                'field_id'      => $this->timesheetFields->where('name', $field)->first()->id,
                'field_name'    => $field,
                'field_value'   => $value,
                'field_key'     => $key
            ]);
        }
    }

    return Redirect::back()->withMessage('The timesheet was successfully created.');
}

All I can suggest - move this:

$data                   = $request->only('user_id', 'template_id');
$data['submitted_by']   = Auth::user()->id;

... into yours request class. For example, into some data() method:

class CreateTimesheetRequest ... {

    ...

    public function data() {
        return array_merge(
            $this->only('user_id', 'template_id'),
            ['submitted_by' => Auth::user()->id]
        );
    }

}

Also, $this->timesheet->saveTimesheetRows(array) looks more like $this->timesheet->saveTimesheetRow(array) for me - name intends to save multiple rows, but you feed that method only with one row per call.

Maybe, you can refactor that method to smth. like this:

function saveTimesheetRows($timesheetId, $key, $rows, $fieldIds) {
    foreach($rows as $field => $value) {
        $this->saveTimesheetRow([
            'timesheet_id'  => $timesheetId,
            'field_id'      => $fieldIds[$field],
            'field_name'    => $field,
            'field_value'   => $value,
            'field_key'     => $key
        ]);
    }
}

function saveTimesheetRow(array $row) {
    // old saveTimesheetRows implementation
}

Upd. And another tip: use Eloquent's keyBy() method like so:

$keyIDs = $this->timesheetFields->whereIn('name', $fields)->get(["name", "id"])->keyBy("name");

So, finally:

public function create(CreateTimesheetRequest $request) {
    $data = $request->data();

    $timesheetId = $this->timesheet->createTimesheet($data);

    foreach($request->get('row') as $key => $row) {

        $this->timesheet->saveTimesheetRows(
            $timesheetId,
            $key,
            $row,
            $this->timesheetFields
                 ->whereIn('name', array_keys($row))
                 ->get(["name", "id"])
                 ->keyBy("name") // probably, can be moved into $this->timesheetFields implementation
        );

    }

    return Redirect::back()->withMessage('The timesheet was successfully created.');
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM