【问题标题】:Laravel trait crud controller with request validation and resources具有请求验证和资源的 Laravel trait crud 控制器
【发布时间】:2020-10-06 08:21:45
【问题描述】:

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

我创建了一个特征 CrudControllerTrait 来实现 index、show、store、update、destroy 方法。 但是我发现了2个问题:

品牌控制器.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:返回资源。如何创建新资源?在集合上我可以解决它:

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

资源在使用 trait 的控制器上:

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

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

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

【问题讨论】:

  • Problem1: 试试Illuminate\Http\RequestIlluminate\Foundation\Http\FormRequest

标签: laravel crud traits code-reuse


【解决方案1】:

我发现的唯一方法是创建一个抽象方法。

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

这样我可以重用很多代码。

【讨论】:

    猜你喜欢
    • 2016-11-12
    • 1970-01-01
    • 2019-12-29
    • 2021-12-26
    • 2021-06-02
    • 1970-01-01
    • 2019-02-25
    • 2017-06-23
    • 2015-07-29
    相关资源
    最近更新 更多