我正在尝试为Laravel构建一个非常通用的CRUD,但我仍然坚持验证 .
我有一个RESTful资源控制器,它将处理任何实体的基本操作:
class CrudController extends Controller {
public function store(StoreRequest $request) {...}
public function update(UpdateRequest $request) {...}
...
}
每个实际实体都有自己的控制器来扩展它,比如说:
-
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()方法,因为在每个EntityController中复制粘贴create()函数逻辑会导致重复的代码 . 此外,它们将具有不同的参数,这将触发"should be compatible with" 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) {...}
...
}
在ArticleController中:
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仍然运行来自CrudController中定义的App \ Http \ Requests \ StoreCRUDRequest的验证 .
知道如何才能实现这一目标吗?