表单数据源

模型与数据仓库

数据仓库(Repository)是一个可以提供特定接口对数据进行读写操作的类,通过数据仓库的引入,可以让页面的构建不再关心数据读写功能的具体实现,开发者只需要实现特定的操作接口即可轻松切换数据源。关于数据仓库的详细用法请参考文档数据仓库

数据来自模型

{tip} 如果你的数据来自Model,那么你也可以直接使用Model实例,底层会自动把Model转化为数据仓库实例。

当数据源支持模型时,只需创建一个非常简单的Repository类既可:

  1. <?php
  2. namespace App\Admin\Repositories;
  3. use Dcat\Admin\Repositories\EloquentRepository;
  4. use App\Models\Movie as MovieModel;
  5. class Movie extends EloquentRepository
  6. {
  7. // 这里定义你的模型类名
  8. protected $eloquentClass = MovieModel::class;
  9. // 通过这个方法可以指定表单页查询的字段,默认"*"
  10. public function getFormColumns()
  11. {
  12. return [$this->getKeyName(), 'name', 'title', 'created_at'];
  13. }
  14. }

使用:

  1. use App\Admin\Repositories\Movie;
  2. $form = new Form(new Movie);
  3. ...

数据来自外部API

下面以豆瓣电影的API为例子,来展示Repository的表单数据读写操作相关接口的用法:

  1. <?php
  2. namespace App\Admin\Repositories;
  3. use Dcat\Admin\Repositories\Repository;
  4. use Dcat\Admin\Form;
  5. class ComingSoon extends Repository
  6. {
  7. protected $api = 'https://api.douban.com/v2/movie/coming_soon';
  8. // 返回你的id字段名称,默认“id”
  9. protected $keyName = '_id';
  10. // 查询编辑页数据
  11. // 这个方法需要返回一个数组
  12. public function edit(Form $form): array
  13. {
  14. // 获取id
  15. $id = $form->builder()->getResourceId();
  16. $data = file_get_contents("http://api.douban.com/v2/movie/subject/$id");
  17. return json_decode($data, true);
  18. }
  19. // 这个方法用于在修改数据前查询原记录
  20. // 如果使用了文件上传表单,当文件发生变更时会根据这个原始记录自动删除旧文件
  21. // 如果不需要此数据返回空数组即可
  22. public function getDataWhenUpdating(Form $form): array
  23. {
  24. // 获取id
  25. $id = $form->builder()->getResourceId();
  26. return [];
  27. }
  28. // 修改操作
  29. // 返回一个bool类型的数据
  30. public function update(Form $form)
  31. {
  32. // 获取id
  33. $id = $form->builder()->getResourceId();
  34. // 获取要修改的数据
  35. $attributes = $form->updates();
  36. // TODO
  37. // 这里写你的修改逻辑
  38. return true;
  39. }
  40. // 这个方法用于在修改数据前查询原始数据
  41. // 如果使用了文件上传表单,会根据这个数据自动删除文件
  42. // 如果不需要此数据返回空数组即可
  43. public function getDataWhenDeleting(Form $form): array
  44. {
  45. $id = $form->builder()->getResourceId();
  46. $id = explode(',', $id);
  47. // $data = file_get_contents("http://api.douban.com/v2/movie/subject/$id");
  48. //
  49. // return json_decode($data, true);
  50. return [];
  51. }
  52. // 删除数据
  53. // $deletingData 是由 getDataWhenDeleting 方法返回的数据
  54. public function destroy(Form $form, array $deletingData)
  55. {
  56. // 注意这里的id可能是多个
  57. $id = $form->builder()->getResourceId();
  58. // 当使用批量删除功能时,这里的id是用“,”隔开的字符串
  59. $id = explode(',', $id);
  60. // TODO
  61. // var_dump($id, $deletingData);
  62. return true;
  63. }
  64. }