Laravel 嵌套资源-控制器-最佳方法?

Laravel 嵌套资源-控制器-最佳方法?,laravel,laravel-5.6,controllers,laravel-controller,Laravel,Laravel 5.6,Controllers,Laravel Controller,我目前正在构建一个应用程序,其中我有多个模型能够“拥有联系人”,并想知道如何在控制器中以最佳方式处理该问题 我在下面列出了一些方法——你们认为哪一种是最好的,为什么?还是你们个人使用的,为什么 方法1-嵌套资源控制器 namespace App\Http\Controllers; class SupplierContactController extends Controller { public function all(Supplier $supplier) {

我目前正在构建一个应用程序,其中我有多个模型能够“拥有联系人”,并想知道如何在控制器中以最佳方式处理该问题

我在下面列出了一些方法——你们认为哪一种是最好的,为什么?还是你们个人使用的,为什么

方法1-嵌套资源控制器

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);
    }
}
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);
    }
}
方法2-扩展另一个父资源控制器的嵌套资源控制器

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);
    }
}
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);
    }
}
方法3-资源控制器,包括每种模型类型的方法

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);
    }
}
方法4-带有路由参数和if语句的资源控制器

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

我想,使用静态调用的方法#2可能很难测试。进近#4与路线紧密相连。不可扩展。顺便说一句,方法1中的依赖注入似乎不错。如果你所有的方法都有相同的逻辑,那么第一种方法是最小的、可读的;但这似乎是一种浪费。每个“父类型”都有一个单独的资源控制器,并且重复代码。当我有适用于许多“父类型”的“联系人”时,反复重复(本质上)完全相同的代码是错误的。我还有其他类似的父/子场景,我将扩展相同的逻辑。提供完整的代码,以便我们可以重构它。抱歉,但我认为不需要“完整的代码”,因为这是一个基于逻辑/最佳方法的问题。有一个孩子(联系人)可以有多种家长类型(学校、供应商、客户)-即:学校可以有联系人列表;供应商可以有联系人列表,客户可以有联系人列表,等等。这种逻辑可以应用到其他类型。例如:child=“banking details”,同样,学校可以有多个银行详细信息,供应商可以有多个银行详细信息。子详细信息保持不变,有一个透视表链接到父详细信息