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);
}
}