Nested Resource - Controller - Best Approach?

127 views Asked by At

I am currently building an application where I have several Models that have the ability to 'have contacts' and wondered how to handle that in the best way in the controllers.

I have laid out some approaches below - which one do you guys think is the best and why or the one you personally use and why?

Approach 1 - Nested Resource Controller

namespace App\Http\Controllers;

class SupplierContactController extends Controller
{
    public function all(Supplier $supplier)
    {
        return response($supplier->contacts);
    }

    public function store(Request $request, Supplier $supplier)
    {
        $supplier->contact($request->user()->id, $request->all());

        return response(null, 201);
    }
}

Approach 2 - Nested Resource Controller that extends another parent Resource controller

namespace App\Http\Controllers;

class SupplierContactController extends ContactController
{
    public function all(Supplier $supplier)
    {
        return parent::all($supplier);
    }

    public function store(Request $request, Supplier $supplier)
    {
        return parent::store($request, $supplier);
    }
}

Approach 3 - Resource Controller with Methods for each Model Type

namespace App\Http\Controllers;

class ContactController extends Controller
{
    public function forSupplier(Supplier $supplier)
    {
        return $this->forModel($supplier);
    }

    public function forCustomer(Customer $customer)
    {
        return $this->forModel($customer);
    }

    public function storeForSupplier(StoreContact $request, Supplier $supplier)
    {
        return $this->store($request, $supplier);
    }

    public function storeForCustomer(StoreContact $request, Customer $customer)
    {
        return $this->store($request, $customer);
    }

    private function forModel(Model $model)
    {
        return response($model->contacts);
    }

    private function store(Request $request, Model $model)
    {
        $model->contact($request->user()->id, $request->all());

        return response(null, 201);
    }
}

Approach 4 - Resource Controller with Route Parameters and if statements

namespace App\Http\Controllers;

class ContactController extends Controller
{
    public function all(string $type, int $id)
    {
        if ($type === 'supplier') $model = Supplier::find($id);
        if ($type === 'customer') $model = Customer::find($id);

        return response($model->contacts);
    }

    public function store(Request $request, string $type, int $id)
    {
        if ($type === 'supplier') $model = Supplier::find($id);
        if ($type === 'customer') $model = Customer::find($id);

        $model->contact($request->user()->id, $request->all());

        return response(null, 201);
    }
}
0

There are 0 answers