PHP code example of nilportugues / laravel5-json-api-dingo
1. Go to this page and download the library: Download nilportugues/laravel5-json-api-dingo library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
nilportugues / laravel5-json-api-dingo example snippets
namespace App\Model\Database;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Validation\ValidatesRequests;
class Employees extends Model
{
public $timestamps = false;
protected $table = 'employees';
protected $primaryKey = 'id';
protected $appends = ['full_name'];
/**
* @return \Illuminate\Database\Eloquent\Relations\HasOne
*/
public function latestOrders()
{
return $this->hasMany(Orders::class, 'employee_id')->limit(10);
}
/**
* @return string
*/
public function getFullNameAttribute()
{
return $this->first_name.' '.$this->last_name;
}
}
namespace App\Model\Database;
use Illuminate\Database\Eloquent\Model;
class Orders extends Model
{
public $timestamps = false;
protected $table = 'orders';
protected $primaryKey = 'id';
/**
* @return \Illuminate\Database\Eloquent\Relations\HasOne
*/
public function employee()
{
return $this->belongsTo(Employees::class, 'employee_id');
}
}
namespace App\Model\Api;
use App\Model\Database\Employees;
use NilPortugues\Api\Mappings\JsonApiMapping;
class EmployeesTransformer implements JsonApiMapping
{
/**
* Returns a string with the full class name, including namespace.
*
* @return string
*/
public function getClass()
{
return Employees::class;
}
/**
* Returns a string representing the resource name
* as it will be shown after the mapping.
*
* @return string
*/
public function getAlias()
{
return 'employee';
}
/**
* Returns an array of properties that will be renamed.
* Key is current property from the class.
* Value is the property's alias name.
*
* @return array
*/
public function getAliasedProperties()
{
return [
'last_name' => 'surname',
];
}
/**
* List of properties in the class that will be ignored by the mapping.
*
* @return array
*/
public function getHideProperties()
{
return [
'attachments'
];
}
/**
* Returns an array of properties that are used as an ID value.
*
* @return array
*/
public function getIdProperties()
{
return ['id'];
}
/**
* Returns a list of URLs. This urls must have placeholders
* to be replaced with the getIdProperties() values.
*
* @return array
*/
public function getUrls()
{
return [
'self' => ['name' => 'employees.show', 'as_id' => 'id'],
'employees' => ['name' => 'employees.index'],
'employee_orders' => ['name' => 'employees.orders', 'as_id' => 'id']
];
}
/**
* Returns an array containing the relationship mappings as an array.
* Key for each relationship defined must match a property of the mapped class.
*
* @return array
*/
public function getRelationships()
{
return [];
}
/**
* Returns an array of properties that are mandatory to be passed in when doing create or update.
*
* @return array
*/
public function getRequiredProperties() {
return [];
}
}
namespace App\Model\Api;
use App\Model\Database\Orders;
use NilPortugues\Api\Mappings\JsonApiMapping;
class OrdersTransformer implements JsonApiMapping
{
/**
* {@inheritDoc}
*/
public function getClass()
{
return Orders::class;
}
/**
* {@inheritDoc}
*/
public function getAlias()
{
return 'order';
}
/**
* {@inheritDoc}
*/
public function getAliasedProperties()
{
return [];
}
/**
* {@inheritDoc}
*/
public function getHideProperties()
{
return [];
}
/**
* {@inheritDoc}
*/
public function getIdProperties()
{
return ['id'];
}
/**
* {@inheritDoc}
*/
public function getUrls()
{
return [
'self' => ['name' => 'orders.show', 'as_id' => 'id'],
'employee' => ['name' => 'employees.show', 'as_id' => 'employee_id'],
];
}
/**
* {@inheritDoc}
*/
public function getRelationships()
{
return [];
}
/**
* Returns an array of properties that are mandatory to be passed in when doing create or update.
*
* @return array
*/
public function getRequiredProperties() {
return [];
}
}
use App\Model\Api\EmployeesTransformer;
use App\Model\Api\OrdersTransformer;
return [
EmployeesTransformer::class,
OrdersTransformer::class,
];
namespace App\Http\Controllers;
use App\Model\Database\Employees;
use NilPortugues\Laravel5\JsonApi\Controller\JsonApiController;
class EmployeesController extends JsonApiController
{
/**
* Return the Eloquent model that will be used
* to model the JSON API resources.
*
* @return \Illuminate\Database\Eloquent\Model
*/
public function getDataModel()
{
return new Employees();
}
}
//Constructor and defined actions
public function __construct(JsonApiSerializer $serializer);
public function listAction();
public function getAction(Request $request);
public function postAction(Request $request);
public function patchAction(Request $request);
public function putAction(Request $request);
public function deleteAction(Request $request);
//Methods returning callables that access the persistence layer
protected function totalAmountResourceCallable();
protected function listResourceCallable();
protected function findResourceCallable(Request $request);
protected function createResourceCallable();
protected function updateResourceCallable();
//Allows modification of the response object
protected function addHeaders(Response $response);
namespace App\Http\Controllers;
use App\Model\Database\Employees;
use App\Model\Database\Orders;
use NilPortugues\Laravel5\JsonApi\Controller\JsonApiController;
class EmployeesController extends JsonApiController
{
/**
* Return the Eloquent model that will be used
* to model the JSON API resources.
*
* @return \Illuminate\Database\Eloquent\Model
*/
public function getDataModel()
{
return new Employees();
}
/**
* @param Request $request
*
* @return \Symfony\Component\HttpFoundation\Response
*/
public function getOrdersByEmployee(Request $request)
{
$apiRequest = RequestFactory::create();
$page = $apiRequest->getPage();
if (!$page->size()) {
$page->setSize(10); //Default elements per page
}
$resource = new ListResource(
$this->serializer,
$page,
$apiRequest->getFields(),
$apiRequest->getSort(),
$apiRequest->getIncludedRelationships(),
$apiRequest->getFilters()
);
$totalAmount = function() use ($request) {
$id = (new Orders())->getKeyName();
return Orders::query()
->where('employee_id', '=', $request->employee_id)
->get([$id])
->count();
};
$results = function() use ($request) {
return EloquentHelper::paginate(
$this->serializer,
Orders::query()
->where('employee_id', '=', $request->employee_id)
)->get();
};
$uri = route('employees.orders', ['employee_id' => $request->employee_id]);
return $resource->get($totalAmount, $results, $uri, Orders::class);
}
}
namespace App\Http\Controllers;
use App\Model\Database\Employees;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
use NilPortugues\Api\JsonApi\Server\Errors\Error;
use NilPortugues\Api\JsonApi\Server\Errors\ErrorBag;
use NilPortugues\Laravel5\JsonApi\Controller\JsonApiController;
class EmployeesController extends JsonApiController
{
/**
* Now you can actually create Employee and Orders at once.
* Use transactions - DB::beginTransaction() for data integrity!
*
* @return callable
*/
protected function createResourceCallable()
{
$createOrderResource = function (Model $model, array $data) {
if (!empty($data['relationships']['order']['data'])) {
$orderData = $data['relationships']['order']['data'];
if (!empty($orderData['type'])) {
$orderData = [$orderData];
}
foreach ($orderData as $order) {
$attributes = array_merge($order['attributes'], ['employee_id' => $model->getKey()]);
Orders::create($attributes);
}
}
};
return function (array $data, array $values, ErrorBag $errorBag) use ($createOrderResource) {
$attributes = [];
foreach ($values as $name => $value) {
$attributes[$name] = $value;
}
if (!empty($data['id'])) {
$attributes[$this->getDataModel()->getKeyName()] = $values['id'];
}
DB::beginTransaction();
try {
$model = $this->getDataModel()->create($attributes);
$createOrderResource($model, $data);
DB::commit();
return $model;
} catch(\Exception $e) {
DB::rollback();
$errorBag[] = new Error('creation_error', 'Resource could not be created');
throw $e;
}
};
}
}
namespace App\Model\Database;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Validation\ValidatesRequests;
class Employees extends Model
{
public $timestamps = false;
protected $table = 'employees';
protected $primaryKey = 'id';
protected $appends = ['full_name'];
/**
* @var array
*/
protected $fillable = [
'company',
'last_name',
'first_name',
'email_address',
'job_title',
'business_phone',
'home_phone',
'mobile_phone',
'fax_number',
'address',
'city',
'state_province',
'zip_postal_code',
'country_region',
'web_page',
'notes',
'attachments',
];
/**
* @return \Illuminate\Database\Eloquent\Relations\HasOne
*/
public function latestOrders()
{
return $this->hasMany(Orders::class, 'employee_id')->limit(10);
}
/**
* @return string
*/
public function getFullNameAttribute()
{
return $this->first_name.' '.$this->last_name;
}
}