Presenter.php 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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. * @return mixed
  33. *
  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. * @return \League\Fractal\Resource\Collection
  53. */
  54. protected function transformCollection($data)
  55. {
  56. $resource = new Collection($data, $this->getTransformer(), $this->resourceKeyCollection);
  57. if ($this->cursor) {
  58. $resource->setCursor($this->cursor);
  59. }
  60. return $resource;
  61. }
  62. /**
  63. * @param AbstractPaginator|LengthAwarePaginator|Paginator $paginator
  64. * @return \League\Fractal\Resource\Collection
  65. */
  66. protected function transformPaginator($paginator)
  67. {
  68. $collection = $paginator->getCollection();
  69. $resource = new Collection($collection, $this->getTransformer(), $this->resourceKeyCollection);
  70. if ($paginator instanceof Paginator) {
  71. $items = $paginator->items();
  72. $total = 0;
  73. $perPage = $paginator->perPage();
  74. $currentPage = $paginator->currentPage();
  75. $options = array_merge(['hasMore' => $paginator->hasMorePages()], $paginator->getOptions());
  76. $paginator = Container::getInstance()->makeWith(LengthAwarePaginator::class, compact(
  77. 'items', 'total', 'perPage', 'currentPage', 'options'
  78. ));
  79. }
  80. $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
  81. return $resource;
  82. }
  83. }