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;
}
(...)
}
通过这种方式,我可以重用很多代码。
我正在尝试重构我的代码以提高可重用性。
我创建了一个特征 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;
}
(...)
}
通过这种方式,我可以重用很多代码。