Laravel 具有请求验证和资源的 trait crud 控制器

Laravel trait crud controller with request validation and resources

我正在尝试重构我的代码以提高可重用性。

我创建了一个特征 CrudControllerTrait 来实现索引、显示、存储、更新、销毁方法。 但是我发现了两个问题:

BrandController.php

public function store(BrandNewRequest $request)
{
    $requestData = $request->validated();
    return new BrandResource($this->brands->store($requestData));
}

ProductController.php

public function store(ProductNewRequest $request)
{
    $requestData = $request->validated();
    return new ProductResource($this->products->store($requestData));
}

特征方法是:

public function store(xxxxx $request)
{
    $requestData = $request->validated();
    return new xxxxxResource($this->repository()->store($requestData));
}

问题1:提示类型。我怎样才能抽象它们?如果我删除它会显示错误:

"message": "Too few arguments to function App\Http\Controllers\BrandController::store(), 0 passed and exactly 1 expected"

问题 2:Return 资源。如何创建新资源?在集合上,我可以这样做来解决它:

public function index()
{
    $models = $this->repository()->index();
    return $this->resource()::collection($models);
}

资源在使用特征的控制器上:

public function resource()
{
    return BrandResource::class;
}

但是单一资源不知道怎么做...

我的想法是,我有这么多控制器使用相同的模式:BrandController、ProductController 等。我喜欢在相同的特征上重用这 5 个 crud 方法...

我找到的唯一方法是创建一个抽象方法。

trait CrudRepositoryTrait
{
    abstract function model();

    public function index()
    {
        return $this->model()::with($this->with())->get();
    }

    public function find($id)
    {
        return $this->model()::findOrFail($id);
    }

    public function store($data)
    {
        $request = $this->dtoRequest($data);
        return $this->model()::create($request);
    }
    
    (...)
}

然后,一个如何使用这个治疗的例子:

class ProductRepository implements ProductRepositoryContract
{
    use CrudRepositoryTrait;

    function model()
    {
        return Product::class;
    }
    
    (...)
}

通过这种方式,我可以重用很多代码。