Skip to content

Commit d2f9672

Browse files
committed
Initial work on data table responder
0 parents  commit d2f9672

File tree

5 files changed

+162
-0
lines changed

5 files changed

+162
-0
lines changed

.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
composer.lock
2+
vendor/
3+
.idea

README.md

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# Laravel API for React Dynamic Data Table
2+
3+
*Work in progress*
4+
5+
This package provides a Laravel API endpoint responder for the
6+
[React Dynamic Data Table](https://github.com/langleyfoxall/react-dynamic-data-table)
7+
component.
8+
9+
## Installation
10+
11+
```bash
12+
composer require langleyfoxall/react-dynamic-data-table-laravel-api
13+
```
14+
15+
## Usage
16+
17+
Example syntax:
18+
19+
```php
20+
use App\User;
21+
use Illuminate\Http\Request;
22+
use LangleyFoxall\ReactDynamicDataTableLaravelApi\DataTableResponder;
23+
24+
class UsersController extends Controller
25+
{
26+
public function dataTable(Request $request)
27+
{
28+
return (new DataTableResponder(User::class, $request))
29+
->setPerPage(10)
30+
->respond();
31+
}
32+
}
33+
34+
```

composer.json

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"name": "langleyfoxall/react-dynamic-data-table-laravel-api",
3+
"description": "Provides a Laravel API endpoint responder for the `react-dynamic-data-table` component.",
4+
"require": {
5+
"php": "^7.0.0",
6+
"illuminate/http": "^5.1",
7+
"illuminate/database": "^5.1",
8+
"langleyfoxall/helpers-laravel": "^1.10"
9+
},
10+
"autoload": {
11+
"psr-4": {
12+
"LangleyFoxall\\ReactDynamicDataTableLaravelApi\\": "src/"
13+
}
14+
},
15+
"license": "LGPL-3.0-only"
16+
}

src/DataTableResponder.php

+100
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
<?php
2+
namespace LangleyFoxall\ReactDynamicDataTableLaravelApi;
3+
4+
use Illuminate\Database\Eloquent\Model;
5+
use Illuminate\Database\Query\Builder;
6+
use Illuminate\Http\Request;
7+
8+
/**
9+
* Class DataTableResponder
10+
* @package LangleyFoxall\ReactDynamicDataTableLaravelApi
11+
*/
12+
class DataTableResponder
13+
{
14+
/**
15+
* @var Model
16+
*/
17+
private $model;
18+
19+
/**
20+
* @var Request
21+
*/
22+
private $request;
23+
24+
/**
25+
* @var int
26+
*/
27+
private $perPage = 15;
28+
29+
/**
30+
* DataTableResponder constructor.
31+
*
32+
* @param $className
33+
* @param Request $request
34+
*/
35+
public function __construct($className, Request $request)
36+
{
37+
if (!class_exists($className)) {
38+
throw new \InvalidArgumentException('Provided class does not exist.');
39+
}
40+
41+
if (!$className instanceof Model) {
42+
throw new \InvalidArgumentException('Provided class is not an Eloquent model.');
43+
}
44+
45+
$this->model = new $className();
46+
$this->request = $request;
47+
}
48+
49+
/**
50+
* Sets the number of records to return per page.
51+
*
52+
* @param int $perPage
53+
* @return DataTableResponder
54+
*/
55+
public function setPerPage($perPage)
56+
{
57+
$this->perPage = $perPage;
58+
return $this;
59+
}
60+
61+
/**
62+
* Builds the Eloquent query based on the request.
63+
*
64+
* @param Request $request
65+
* @return \Illuminate\Database\Eloquent\Builder
66+
*/
67+
private function buildQuery(Request $request)
68+
{
69+
$orderByField = $request->get('orderByField');
70+
$orderByDirection = $request->get('orderByDirection');
71+
72+
$query = $this->model->query();
73+
74+
if ($orderByField && $orderByDirection) {
75+
$query->orderBy($orderByField, $orderByDirection);
76+
}
77+
78+
return $query;
79+
}
80+
81+
/**
82+
* @param Builder $query
83+
* @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
84+
*/
85+
private function paginateQuery(Builder $query)
86+
{
87+
return $query->paginate($this->perPage);
88+
}
89+
90+
/**
91+
* @return \Illuminate\Http\JsonResponse
92+
*/
93+
public function respond()
94+
{
95+
$query = $this->buildQuery($this->request);
96+
$results = $this->paginateQuery($query);
97+
98+
return DataTableResponse::success($results)->json();
99+
}
100+
}

src/DataTableResponse.php

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
namespace LangleyFoxall\ReactDynamicDataTableLaravelApi;
3+
4+
use LangleyFoxall\Helpers\ApiResponse;
5+
6+
class DataTableResponse extends ApiResponse
7+
{
8+
9+
}

0 commit comments

Comments
 (0)