Skip to content

CrudControllerHelper

The CrudControllerHelper is a helper class that is used to create a controller for a model. It provides a set of methods that can be used to create a CRUD controller for a model.

Class

php
<?php

namespace App\Http\Controllers;

use App\Helpers\FilterHelper;
use App\Helpers\RelationHelper;
use App\Helpers\UpdateRelationsHelper;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Request;

class CRUDControllerHelper extends Controller
{
    protected $model;

    public function __construct(Model $model)
    {
        $this->model = $model;
    }

    /**
     * Display a listing of the resource.
     */
    public function list(Request $request)
    {
        $entities = $this->model->query();

        if (! is_null(request('fromRelation'))) {
            if (! is_array(request('fromRelation'))) {
                abort(400, 'Invalid fromRelation format');
            }
            $relationParams = request('fromRelation');
            if (! class_exists($relationParams['model'])) {
                abort(400, 'Invalid model');
            }
            if (! isset($relationParams['id'])) {
                abort(400, 'Invalid id');
            }
            $model = new $relationParams['model'];
            $entities = RelationHelper::fromRelation($model, $relationParams['id'], $relationParams['relation']);
        }

        if (! is_null(request('notFromRelation'))) {
            if (! is_null(request('fromRelation'))) {
                abort(400, 'fromRelation and notFromRelation cannot be used together');
            }
            if (! is_array(request('notFromRelation'))) {
                abort(400, 'Invalid notFromRelation format');
            }
            $relationParams = request('notFromRelation');
            if (! class_exists($relationParams['model'])) {
                abort(400, 'Invalid model');
            }
            if (! isset($relationParams['id'])) {
                abort(400, 'Invalid id');
            }
            $model = new $relationParams['model'];
            $entities = RelationHelper::notFromRelation($model, $relationParams['id'], $relationParams['relation']);
        }

        if (! is_null(request('search'))) {
            $entities = $this->model->search(request('search'));
        }

        if (! is_null(request('filters'))) {
            FilterHelper::applyFilters($entities, request('filters'));
        }

        if (! is_null(request('orderBy'))) {
            if (request('order') !== 'asc' && request('order') !== 'desc') {
                abort(400, 'Invalid order');
            }
            $entities->orderBy(request('orderBy'), request('order', 'asc'));
        }

        if (! is_null(request('with'))) {
            $entities->with(request('with'));
        }

        return $entities->paginate($request->input('per_page', 25));
    }

    /**
     * Display the specified resource.
     */
    public function show(Model $entity)
    {
        if (! is_null(request('with'))) {
            $entity->load(request('with'));
        }

        return $entity;
    }

    /**
     * Store a newly created resource in storage.
     */
    public function store(FormRequest $request)
    {
        $params = $request->input();

        return $this->model->create($params);
    }

    /**
     * Update the specified resource in storage.
     */
    public function update(FormRequest $request, Model $entity)
    {
        $entity->update($request->input());

        return $entity;
    }

    /**
     * Update the specified resource relations in storage.
     */
    public function updateRelation(Request $request, Model $entity, string $relation)
    {
        UpdateRelationsHelper::updateRelation($entity, $relation, $request->input('method'), $request->input('params', []));

        return $entity->load($relation);
    }

    /**
     * Remove the specified resource from storage.
     */
    public function destroy(Model $entity)
    {
        $entity->delete();
    }
}

Properties

For precise parameter documentation you can view API - Api.

protected $model

  • Type: Model
  • Required: true
  • Description: The model that the controller is managing.

Methods

list

  • Type: (Request $request) => LengthAwarePaginator<Model>
  • Description: Display a paginated list of resources.

show

  • Type: (Model $entity) => Model
  • Description: Display the specified resource.

$request['with']

  • Type: string[]
  • Description: The relations to load with the entity.

store

  • Type: (FormRequest $request) => Model
  • Description: Store a newly created resource in storage.

update

  • Type: (FormRequest $request, Model $entity) => Model
  • Description: Update the specified resource in storage.

updateRelation

  • Type: (Request $request, Model $entity, string $relation) => Model
  • Description: Update the specified resource relations in storage.

destroy

  • Type: (Model $entity) => void
  • Description: Remove the specified resource from storage.