1. Go to this page and download the library: Download jarischaefer/hal-api 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/ */
class HomeController extends HalApiController
{
public function index(HalApiRequestParameters $parameters)
{
return $this->responseFactory->json($this->createResponse($parameters)->build());
}
}
class UsersController extends HalApiResourceController
{
public static function getRelationName(): string
{
return 'users';
}
public function __construct(HalApiControllerParameters $parameters, UserTransformer $transformer, UserRepository $repository)
{
parent::__construct($parameters, $transformer, $repository);
}
public function posts(HalApiRequestParameters $parameters, PostsController $postsController, User $user): Response
{
$posts = $user->posts()->paginate($parameters->getPerPage());
$response = $postsController->paginate($parameters, $posts)->build();
return $this->responseFactory->json($response);
}
}
class PostsController extends HalApiResourceController
{
public static function getRelationName(): string
{
return 'posts';
}
public function __construct(HalApiControllerParameters $parameters, PostTransformer $transformer, PostRepository $repository)
{
parent::__construct($parameters, $transformer, $repository);
}
}
class User extends Model implements AuthenticatableContract, CanResetPasswordContract
{
use Authenticatable, CanResetPassword;
/**
* The attributes excluded from the model's JSON form.
*
* @var array
*/
protected $hidden = ['password', 'remember_token'];
public function posts()
{
return $this->hasMany(Post::class);
}
}
class Post extends Model
{
// ...
public function user()
{
return $this->belongsTo(User::class);
}
}
class UserRepository extends HalApiEloquentRepository
{
public static function getModelClass(): string
{
return User::class;
}
}
class PostRepository extends HalApiEloquentRepository
{
public static function getModelClass(): string
{
return Post::class;
}
}
class UserRepository extends HalApiEloquentSearchRepository
{
public static function getModelClass(): string
{
return User::class;
}
public static function searchableFields(): array
{
return [User::COLUMN_NAME];
}
}
class PostRepository extends HalApiEloquentSearchRepository
{
public static function getModelClass(): string
{
return Post::class;
}
public static function searchableFields(): array
{
return ['*'];
}
}
class UserTransformer extends HalApiTransformer
{
public function transform(Model $model)
{
/** @var User $model */
return [
'id' => (int)$model->id,
'username' => (string)$model->username,
'email' => (string)$model->email,
'firstname' => (string)$model->firstname,
'lastname' => (string)$model->lastname,
'disabled' => (bool)$model->disabled,
];
}
}
class PostTransformer extends HalApiTransformer
{
public function transform(Model $model)
{
/** @var Post $model */
return [
'id' => (int)$model->id,
'title' => (string)$model->title,
'text' => (string)$model->text,
'user_id' => (int)$model->user_id,
];
}
}
class PostTransformer extends HalApiTransformer
{
private $userRoute;
private $userRelation;
public function __construct(LinkFactory $linkFactory, RepresentationFactory $representationFactory, RouteHelper $routeHelper, Route $self, Route $parent)
{
parent::__construct($linkFactory, $representationFactory, $routeHelper, $self, $parent);
$this->userRoute = $routeHelper->byAction(UsersController::actionName(RouteHelper::SHOW));
$this->userRelation = UsersController::getRelation(RouteHelper::SHOW);
}
public function transform(Model $model)
{
/** @var Post $model */
return [
'id' => (int)$model->id,
'title' => (string)$model->title,
'text' => (string)$model->text,
'user_id' => (int)$model->user_id,
];
}
protected function getLinks(Model $model)
{
/** @var Post $model */
return [
$this->userRelation => $this->linkFactory->create($this->userRoute, $model->user_id),
];
}
}
class PostTransformer extends HalApiTransformer
{
private $userTransformer;
private $userRelation;
public function __construct(LinkFactory $linkFactory, RepresentationFactory $representationFactory, RouteHelper $routeHelper, Route $self, Route $parent, UserTransformer $userTransformer)
{
parent::__construct($linkFactory, $representationFactory, $routeHelper, $self, $parent);
$this->userTransformer = $userTransformer;
$this->userRelation = UsersController::getRelation(RouteHelper::SHOW);
}
public function transform(Model $model)
{
/** @var Post $model */
return [
'id' => (int)$model->id,
'title' => (string)$model->title,
'text' => (string)$model->text,
'user_id' => (int)$model->user_id,
];
}
protected function getEmbedded(Model $model)
{
/** @var Post $model */
return [
$this->userRelation => $this->userTransformer->item($model->user),
];
}
}
RouteHelper::make($router)
->get('/', HomeController::class, 'index') // Link GET / to the index method in HomeController
->resource('users', UsersController::class) // Start a new resource block
->get('posts', 'posts') // Link GET /users/{users}/posts to the posts method in UsersController
->done() // Close the resource block
->resource('posts', PostsController::class)
->done();