php - 请求的 Laravel 5 变量类型提示

标签 php laravel-5

我正在尝试为 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/

相关文章:

php - Laravel 5.2 - PHPExcel_Writer_Exception : Unable to load PDF Rendering library in

php - Laravel 服务容器是否可以绑定(bind)到类及其所有祖先 - 就像在 Symfony 中一样

laravel - 为什么我的 updateOrInsert 不工作 laravel

javascript - 从一个html页面点击获取链接id并将其发送到另一个页面

php - 如何在 laravel 5.6 中使用关系从 id 显示名称?

php - 奇怪的主机问题

php - 在循环中的 2 个 <tr> 上显示自定义标题

php - 如何在实际服务器上托管使用 laravel 5 制作的网站?

php - 在 Symfony2 的产品中使用 assetic 时找不到 Twitter Bootstrap glyphicons 字体

php - 无法将太大的sql文件导入mysql