我正在尝试为 Laravel 构建一个非常通用的 CRUD,但我在验证方面遇到了困难。
我有一个 RESTful 资源 Controller ,它将处理任何实体的基本操作:
class CrudController extends Controller {
public function store(StoreRequest $request) {...}
public function update(UpdateRequest $request) {...}
...
}
每个实际实体都有自己的 Controller 来扩展它,比如:
- ArticleController 扩展了 CrudController
- CategoryController 扩展了 CrudController
- TagController 扩展了 CrudController
因此,当您在 ArticleController() 中调用 create() 方法时,它基本上会调用 CrudController::create()。
到目前为止一切顺利。现在有验证问题:
对于 Article 实体,我将在以下位置定义验证规则:
app/Http/Requests/StoreArticleRequest.php
app/Http/Requests/UpdateArticleRequest.php
但是请求的类已经在 CrudController 中定义了,所以 Laravel 将使用这些类来进行类型提示,所以执行的验证将来自 StoreRequest 而不是我想要一个,StoreArticleRequest。
如何将这些类传递给 CrudController 中的 create() 和 update() 方法?
不能做:
我不想在 ArticleController 中重新定义 create() 方法,因为复制粘贴 create() 函数逻辑每个 EntityController 都会导致重复的代码。此外,它们会有不同的参数,这会触发“应该兼容”PHP 错误。
已经尝试过:
在 CrudController 中:
use App\Http\Requests\StoreCRUDRequest as StoreRequest;
use App\Http\Requests\UpdateCRUDRequest as UpdateRequest;
class CrudController extends Controller {
public function store(StoreRequest $request) {...}
public function update(UpdateRequest $request) {...}
...
}
在文章 Controller 中:
use App\Http\Requests\StoreArticleRequest as StoreRequest;
use App\Http\Requests\UpdateArticleRequest as UpdateRequest;
class ArticleController extends CrudController {
...
// the create() and store() methods are no longer defined here
}
但这不起作用,因为 ArticleController Laravel 仍然运行来自 App\Http\Requests\StoreCRUDRequest 的验证,定义在 CrudController 中。
知道如何实现这一点吗?
最佳答案
除了类型提示,您还可以使用 resolve()
帮助器来解析 FormRequest 类。查看FormRequestServiceProvider在第 33 行和 helper docs
abstract class CrudController extends Controller {
protected $modelClassName; # Name of your model class
protected $storeRequest; # Name of your store FormRequest class
protected $updateRequest; # Name of your update FormRequest class
public function store(): Model {
$modelClassName = $this->modelClassName;
$request = resolve($this->storeRequest);
$instance = $modelClassName::create($request->validated());
return $instance;
}
public function update($id): Model {
$modelClassName = $this->modelClassName;
$instance = $modelClassName::find($id);
$request = resolve($this->updateRequest);
$instance->fill($request->validated())->save();
return $instance;
}
}
关于php - 请求的 Laravel 5 变量类型提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30034700/