Presenter.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <?php
  2. /*
  3. * This file is part of the Jiannei/lumen-api-starter.
  4. *
  5. * (c) Jiannei <longjian.huang@foxmail.com>
  6. *
  7. * This source file is subject to the MIT license that is bundled
  8. * with this source code in the file LICENSE.
  9. */
  10. namespace App\Repositories\Presenters;
  11. use Exception;
  12. use Illuminate\Container\Container;
  13. use Illuminate\Database\Eloquent\Collection as EloquentCollection;
  14. use Illuminate\Pagination\AbstractPaginator;
  15. use Illuminate\Pagination\LengthAwarePaginator;
  16. use Illuminate\Pagination\Paginator;
  17. use League\Fractal\Pagination\Cursor;
  18. use League\Fractal\Pagination\IlluminatePaginatorAdapter;
  19. use League\Fractal\Resource\Collection;
  20. use Prettus\Repository\Presenter\FractalPresenter;
  21. abstract class Presenter extends FractalPresenter
  22. {
  23. protected $cursor = null;
  24. public function makeCursor($current, $previous, $next, $count)
  25. {
  26. $this->cursor = new Cursor(...func_get_args());
  27. }
  28. /**
  29. * Prepare data to present.
  30. *
  31. * @param $data
  32. *
  33. * @return mixed
  34. * @throws Exception
  35. */
  36. public function present($data)
  37. {
  38. if (! class_exists('League\Fractal\Manager')) {
  39. throw new Exception(trans('repository::packages.league_fractal_required'));
  40. }
  41. if ($data instanceof EloquentCollection) {
  42. $this->resource = $this->transformCollection($data);
  43. } elseif ($data instanceof AbstractPaginator) {
  44. $this->resource = $this->transformPaginator($data);
  45. } else {
  46. $this->resource = $this->transformItem($data);
  47. }
  48. return $this->fractal->createData($this->resource)->toArray();
  49. }
  50. /**
  51. * @param $data
  52. *
  53. * @return \League\Fractal\Resource\Collection
  54. */
  55. protected function transformCollection($data)
  56. {
  57. $resource = new Collection($data, $this->getTransformer(), $this->resourceKeyCollection);
  58. if ($this->cursor) {
  59. $resource->setCursor($this->cursor);
  60. }
  61. return $resource;
  62. }
  63. /**
  64. * @param AbstractPaginator|LengthAwarePaginator|Paginator $paginator
  65. *
  66. * @return \League\Fractal\Resource\Collection
  67. */
  68. protected function transformPaginator($paginator)
  69. {
  70. $collection = $paginator->getCollection();
  71. $resource = new Collection($collection, $this->getTransformer(), $this->resourceKeyCollection);
  72. if ($paginator instanceof Paginator) {
  73. $items = $paginator->items();
  74. $total = 0;
  75. $perPage = $paginator->perPage();
  76. $currentPage = $paginator->currentPage();
  77. $options = array_merge(['hasMore' => $paginator->hasMorePages()], $paginator->getOptions());
  78. $paginator = Container::getInstance()->makeWith(LengthAwarePaginator::class, compact(
  79. 'items', 'total', 'perPage', 'currentPage', 'options'
  80. ));
  81. }
  82. $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
  83. return $resource;
  84. }
  85. }