我正在尝试为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的验证 .

知道如何才能实现这一目标吗?