Last active
July 18, 2019 13:35
-
-
Save MrJmpl3/578ab87ef3e46e0dd4bf5d77e537e71e to your computer and use it in GitHub Desktop.
ApiTrait - Trait helpers to Laravel API Resources
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Copyright (c) 2018. | |
* Archivo desarrollado por Jose Manuel Casani Guerra bajo el pseudonimo de MrJmpl3 | |
* | |
* Email: jmpl3.soporte@gmail.com | |
* Twitter: @MrJmpl3 | |
* Pagina Web: https://mrjmpl3-official.es | |
*/ | |
namespace App\Traits; | |
use Illuminate\Support\Carbon; | |
use Illuminate\Support\Facades\Schema; | |
use Illuminate\Support\Facades\Validator; | |
/** | |
* Trait ApiTrait | |
* | |
* @package App\Traits | |
*/ | |
trait ApiTrait | |
{ | |
/** | |
* Sirve para seleccionar datos | |
* | |
* Ejemplo: /product?fields=column1,column2,column3,column4 | |
* | |
* @param \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Builder $model | |
* @return \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Model | |
*/ | |
protected function fields($model) | |
{ | |
/** | |
* Si existe la consulta de fields | |
*/ | |
if (request()->has('fields')) { | |
/** | |
* Obtengo las columnas de la tabla del modelo | |
*/ | |
$columns = Schema::getColumnListing($model->getModel()->getTable()); | |
/** | |
* Obtengo la linea de consulta de fields | |
*/ | |
$queryFields = explode(',', request()->get('fields')); | |
/** | |
* Arreglo de Select | |
*/ | |
$selectColumns = []; | |
/** | |
* Recorro las columnas | |
*/ | |
foreach ($columns as $column) { | |
/** | |
* Verifico si la columna esta asignada en el transform | |
*/ | |
if (isset($model->getModel()->transforms[$column])) { | |
/** | |
* Verifico si la columna modificada esta en la consulta | |
*/ | |
if (in_array($model->getModel()->transforms[$column], $queryFields)) { | |
$selectColumns[] = $column; | |
} | |
} else { | |
/** | |
* Verifico si la columna esta en la consulta | |
*/ | |
if (in_array($column, $queryFields)) { | |
$selectColumns[] = $column; | |
} | |
} | |
} | |
/** | |
* Selecciono segun la consulta solo si el arreglo de Select no esta vacio | |
*/ | |
if (count($selectColumns) > 0) { | |
$model = $model->select($selectColumns); | |
} | |
} | |
/** | |
* Retorno el modelo | |
*/ | |
return $model; | |
} | |
/** | |
* Sirve para filtrar datos | |
* | |
* Ejemplo: /product?column=value&column2=value2 | |
* | |
* @param \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Builder $model | |
* @return \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Model | |
*/ | |
protected function filter($model) | |
{ | |
/** | |
* Obtengo las columnas de la tabla del modelo | |
*/ | |
$columns = Schema::getColumnListing($model->getTable()); | |
/** | |
* Obtengo el tipo de variable de cada columna | |
*/ | |
$casts = $model->getCasts(); | |
/** | |
* Recorro las columnas | |
*/ | |
foreach ($columns as $column) { | |
/** | |
* Verifico si la columna esta asignada en el transform | |
*/ | |
if (isset($model->getModel()->transforms[$column])) { | |
/** | |
* Verifico si la columna modificado existe en la peticion | |
*/ | |
if (request()->has($model->getModel()->transforms[$column])) { | |
/** | |
* Ejecuto el where segun el casteo y dato enviado | |
*/ | |
if (request()->input($model->getModel()->transforms[$column]) === '') { | |
$model = $model->where($column, '=', null); | |
} else { | |
switch ($casts[$column]) { | |
case 'int': | |
case 'integer': | |
$model = $model->where($column, '=', intval(request()->input($model->getModel()->transforms[$column]))); | |
break; | |
case 'real': | |
case 'float': | |
case 'double': | |
$model = $model->where($column, '=', floatval(request()->input($model->getModel()->transforms[$column]))); | |
break; | |
case 'string': | |
$model = $model->where($column, '=', strval(request()->input($model->getModel()->transforms[$column]))); | |
break; | |
case 'bool': | |
case 'boolean': | |
$model = $model->where($column, '=', boolval(request()->input($model->getModel()->transforms[$column]))); | |
break; | |
case 'date': | |
case 'datetime': | |
$model = $model->where($column, '=', Carbon::createFromFormat('d/m/Y', request()->input($model->getModel()->transforms[$column]), 'America/Lima')->format('Y-m-d')); | |
break; | |
} | |
} | |
} | |
} else { | |
/** | |
* Ejecuto el where segun el casteo y dato enviado | |
*/ | |
if (request()->has($column)) { | |
if (request()->input($column) === '') { | |
$model = $model->where($column, '=', null); | |
} else { | |
switch ($casts[$column]) { | |
case 'int': | |
case 'integer': | |
$model = $model->where($column, '=', intval(request()->input($column))); | |
break; | |
case 'real': | |
case 'float': | |
case 'double': | |
$model = $model->where($column, '=', floatval(request()->input($column))); | |
break; | |
case 'string': | |
$model = $model->where($column, '=', strval(request()->input($column))); | |
break; | |
case 'bool': | |
case 'boolean': | |
$model = $model->where($column, '=', boolval(request()->input($column))); | |
break; | |
case 'date': | |
case 'datetime': | |
$model = $model->where($column, '=', Carbon::createFromFormat('d/m/Y', request()->input($column), 'America/Lima')->format('Y-m-d')); | |
break; | |
} | |
} | |
} | |
} | |
} | |
return $model; | |
} | |
/** | |
* Sirve para ordenar datos | |
* | |
* Ejemplo: /product?sort=-column1,column2 | |
* | |
* Con prefijo negativo = desc | |
* Sin prefijo negativo = asc | |
* | |
* @param \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Builder $model | |
* @return \Illuminate\Database\Eloquent\Model | |
*/ | |
protected function sort($model) | |
{ | |
/** | |
* Si existe la consulta de sortBy | |
*/ | |
if (request()->has('sortBy')) { | |
/** | |
* Obtengo la linea de consulta de sortBy | |
*/ | |
$querySortBy = explode(',', request()->get('sortBy')); | |
/** | |
* Obtengo las columnas de la tabla del modelo | |
*/ | |
$columns = Schema::getColumnListing($model->getTable()); | |
/** | |
* Recorro las columnas | |
*/ | |
foreach ($columns as $column) { | |
/** | |
* Verifico si la columna esta asignada en el transform | |
*/ | |
if (isset($model->getModel()->transforms[$column])) { | |
/** | |
* En caso de que existe una query de la columna modificada | |
* Caso aparte: En caso de que existe una query de la columna pero con un '-' | |
*/ | |
if (in_array($model->getModel()->transforms[$column], array_values($querySortBy))) { | |
$model = $model->orderBy($column, 'asc'); | |
} elseif (in_array('-'.$model->getModel()->transforms[$column], array_values($querySortBy))) { | |
$model = $model->orderBy($column, 'desc'); | |
} | |
} else { | |
/** | |
* En caso de que existe una query de la columna | |
* Caso aparte: En caso de que existe una query de la columna pero con un '-' | |
*/ | |
if (in_array($column, array_values($querySortBy))) { | |
$model = $model->orderBy($column, 'asc'); | |
} elseif (in_array('-'.$column, array_values($querySortBy))) { | |
$model = $model->orderBy($column, 'desc'); | |
} | |
} | |
} | |
/** | |
* Retorno el modelo | |
*/ | |
return $model; | |
} else { | |
/** | |
* Retorno el modelo con el orderBy basico | |
*/ | |
return $model->orderBy('id', 'asc'); | |
} | |
} | |
/** | |
* Sirve para paginar las respuestas | |
* | |
* Ejemplo: /product?paginate=true | |
* Ejemplo 2: /product?paginate=true&per_page=5 | |
* | |
* @param \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Builder $model | |
* @return \Illuminate\Contracts\Pagination\LengthAwarePaginator|\Illuminate\Database\Eloquent\Model | |
* @throws \Illuminate\Validation\ValidationException | |
*/ | |
protected function paginate($model) | |
{ | |
/** | |
* Valor inicial de Paginas | |
*/ | |
$perPage = 15; | |
/** | |
* Si existe la consulta | |
*/ | |
if (request()->has('per_page')) { | |
/** | |
* Valido que este correcto el parametro | |
*/ | |
$rulesPerPage = [ | |
'per_page' => 'integer|min:2|max:50', | |
]; | |
Validator::validate(request()->all(), $rulesPerPage); | |
/** | |
* Asigno el nuevo valor | |
*/ | |
$perPage = intval(request()->get('per_page')); | |
} | |
/** | |
* Valor inicial de Paginacion | |
*/ | |
$paginate = true; | |
/** | |
* Si existe la consulta | |
*/ | |
if (request()->has('paginate')) { | |
/** | |
* Asigno el nuevo valor | |
*/ | |
$paginate = (request()->input('paginate') === 'true'); | |
} | |
/** | |
* Retorno el modelo final con/sin la paginacion conservando las demas queries en meta - links | |
*/ | |
return $paginate ? $model->paginate($perPage)->appends(request()->all()) : $model->get(); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Copyright (c) 2018. | |
* Archivo desarrollado por Jose Manuel Casani Guerra bajo el pseudonimo de MrJmpl3 | |
* | |
* Email: jmpl3.soporte@gmail.com | |
* Twitter: @MrJmpl3 | |
* Pagina Web: https://mrjmpl3-official.es | |
*/ | |
namespace App; | |
use Illuminate\Database\Eloquent\Model; | |
use OwenIt\Auditing\Contracts\Auditable; | |
/** | |
* Class Product | |
* | |
* @package App | |
*/ | |
class Product extends Model | |
{ | |
/** | |
* @var string | |
*/ | |
protected $table = 'products'; | |
/** | |
* @var array | |
*/ | |
protected $casts = [ | |
'id' => 'integer', | |
'name' => 'string', | |
]; | |
/** | |
* @var array | |
*/ | |
public $transforms = [ | |
'id' => 'code' | |
]; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Copyright (c) 2018. | |
* Archivo desarrollado por Jose Manuel Casani Guerra bajo el pseudonimo de MrJmpl3 | |
* | |
* Email: jmpl3.soporte@gmail.com | |
* Twitter: @MrJmpl3 | |
* Pagina Web: https://mrjmpl3-official.es | |
*/ | |
namespace App\Http\Controllers\Api\v1; | |
use App\Http\Resources\ProductCollection; | |
use App\Product; | |
use App\Traits\ApiTrait; | |
/** | |
* Class ProductosController | |
* | |
* @package App\Http\Controllers\Api | |
*/ | |
class ProductsController extends Controller | |
{ | |
use ApiTrait; | |
/** | |
* @return \Illuminate\Http\JsonResponse | |
* @throws \Illuminate\Validation\ValidationException | |
*/ | |
public function index() | |
{ | |
$products = new Product(); | |
/** | |
* Filter data: /product?column=value&column2=value2 | |
*/ | |
$products = $this->filter($products); | |
/** | |
* Sort data: /product?sort=-column1,column2 | |
* With the negative prefix = desc | |
* Without the negative prefix = asc | |
*/ | |
$products = $this->sort($products); | |
/** | |
* Fields o Select data: /product?fields=column1,column2,column3,column4 | |
*/ | |
$products = $this->fields($products); | |
/** | |
* Paginate: /product?paginate=true | |
* PerPage: /product?paginate=true&per_page=5 | |
*/ | |
$products = $this->paginate($products); | |
/** | |
* Response | |
*/ | |
return new ProductCollection($products); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Copyright (c) 2018. | |
* Archivo desarrollado por Jose Manuel Casani Guerra bajo el pseudonimo de MrJmpl3 | |
* | |
* Email: jmpl3.soporte@gmail.com | |
* Twitter: @MrJmpl3 | |
* Pagina Web: https://mrjmpl3-official.es | |
*/ | |
namespace App\Http\Resources; | |
use Illuminate\Http\Resources\Json\JsonResource; | |
/** | |
* Class Product | |
* | |
* @package App\Http\Resources | |
*/ | |
class Product extends JsonResource | |
{ | |
/** | |
* Transform the resource into an array. | |
* | |
* @param \Illuminate\Http\Request $request | |
* @return array | |
*/ | |
public function toArray($request) | |
{ | |
/** @var \App\Product $this */ | |
return [ | |
$this->transforms['id'] => $this->id, | |
'name' => $this->name, | |
'created_at' => $this->created_at, | |
'updated_at' => $this->updated_at, | |
]; | |
} | |
} |
Traslado a repositorio: https://github.com/MrJmpl3/Laravel_Restful_Helper
Translate to repo: https://github.com/MrJmpl3/Laravel_Restful_Helper
hi, i just found your comment from the fb graph search, i am having hard time in understanding, please i tried to use thttps://sowdust.github.io/fb-search/he when ever i put the fb id of target i dont really know what to do, there three options down . if if copy URL what should i do with it . i kindly need your help or guidence . thank you so much ,
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Se ha agregado un transform simple pero util para el Trait y las API Resources