Description
This is a library for creating documents in the application/hal+json and application/hal+xml hypermedia formats
It requires PHP 5.4 or later.
HAL alternatives and similar libraries
Based on the "API" category.
Alternatively, view HAL alternatives based on common mentions on social networks and blogs.
-
API Platform
πΈοΈ Create REST and GraphQL APIs, scaffold Jamstack webapps, stream changes in real-time. -
Restler
Simple and effective multi-format Web API Server to host your PHP API as Pragmatic REST and/or RESTful API -
wsdl2phpgenerator
DISCONTINUED. Simple utility and class library for generating php classes from a wsdl file. -
OverblogGraphQLBundle
This bundle provides tools to build a complete GraphQL API server in your Symfony App. -
Pinterest Bot for PHP
DISCONTINUED. This PHP library will help you to work with your Pinterest account without using any API account credentials. -
Slack for PHP
A simple PHP package for sending messages to Slack, with a focus on ease of use and elegant syntax. -
chubbyphp-framework
A minimal, highly performant middleware PSR-15 microframework built with as little complexity as possible, aimed primarily at those developers who want to understand all the vendors they use. -
Drest
Quickly and easily expose Doctrine entities as REST resource endpoints with the use of simple configuration with annotations, yaml, json or a PHP array. -
cidaas SDK for php
With this SDK, you can integrate cidaas smoothly and with minimal effort into your PHP application. It enables you to map the most important user flows for OAuth2 and OIDC compliant authentication. Secure β Fast β And unrivaled Swabian. -
yii2-fractal
A set of utils and actions for build API following JSON:Api specification, based on league/fractal -
icanhazstring/expressive-hashids-middleware
PSR-15/PSR-7 compliant middleware using ivanakimov/hashids.php
CodeRabbit: AI Code Reviews for Developers

* Code Quality Rankings and insights are calculated and provided by Lumnify.
They vary from L1 to L5 with "L5" being the highest.
Do you think we are missing an alternative of HAL or a related project?
README
Nocarrier\Hal
This is a library for creating documents in the application/hal+json and application/hal+xml hypermedia formats
It requires PHP 5.4 or later.
<?php
require_once 'vendor/autoload.php';
use Nocarrier\Hal;
$hal = new Hal('/orders');
$hal->addLink('next', '/orders?page=2');
$hal->addLink('search', '/orders?id={order_id}');
$resource = new Hal(
'/orders/123',
array(
'total' => 30.00,
'currency' => 'USD',
)
);
$resource->addLink('customer', '/customer/bob', array('title' => 'Bob Jones <[email protected]>'));
$hal->addResource('order', $resource);
echo $hal->asJson();
echo $hal->asXml();
Installation
The preferred method of installation is via packagist as this provides the PSR-0 autoloader functionality. The following command will download and install the latest version of the Hal library into your project.
php composer.phar require nocarrier/hal
Alternatively, clone the project and install into your project manually.
License
Nocarrier\Hal is licensed under the MIT license.
Usage
Creating Hal Resources
A Hal resource can be created with no values set:
$hal = new \Nocarrier\Hal();
with a URI for the resource:
$hal = new \Nocarrier\Hal('/orders');
and also with an array of data:
$hal = new \Nocarrier\Hal('/orders', ['customerId' => 'CUS1234']);
Hal resources can also be created from existing XML or JSON documents:
$hal = \Nocarrier\Hal::fromJson($jsonString);
$hal = \Nocarrier\Hal::fromXml($xmlString);
$hal = \Nocarrier\Hal::fromXml($simpleXMLElement);
The depth of embedded resources parsed with both these methods is controlled by a second argument, which defaults to 0:
$hal = \Nocarrier\Hal::fromJson($jsonString, 5);
Getting Representations
The Hal resource can be formatted as JSON or XML:
$hal = new \Nocarrier\Hal('/orders', ['customerId' => 'CUS1234']);
$hal->asJson();
which with a first argument of true
for pretty printing:
$hal = new \Nocarrier\Hal('/orders', ['customerId' => 'CUS1234']);
$hal->asJson(true);
gives:
{
"customerId": "CUS1234",
"_links": {
"self": {"href": "/orders"}
}
}
and
$hal = new \Nocarrier\Hal('/orders', ['customerId' => 'CUS1234']);
$hal->asXml(true);
gives:
<?xml version="1.0"?>
<resource href="/orders">
<customerId>CUS1234</customerId>
</resource>
Data
The data can be set through setData
and read with getData
:
$hal = new \Nocarrier\Hal('/orders');
$hal->setData(['customerId' => 'CUS1234']);
$hal->getData();
Using array keys in the data for the XML representation can be done by
prefixing the key with @
:
$hal = new \Nocarrier\Hal('/orders');
$hal->setData(['customerId' => ['CUS1234', '@type' => 'legacy']]);
gives:
<?xml version="1.0"?>
<resource href="/orders">
<customerId value="CUS1234" type="legacy"/>
</resource>
The @
is ignored if JSON is rendered:
{
"customerId": {
"value": "CUS1234",
"type":" legacy"
},
"_links": {
"self": {"href": "/orders"}
}
}
Links
Links can be added to the resource by providing the rel identifying them and a URI:
$hal = new \Nocarrier\Hal('/orders', ['customerId' => 'CUS1234']);
$hal->addLink('next', '/orders?page=2');
$hal->addLink('search', '/orders?id={order_id}');
gives:
{
"customerId": "CUS1234",
"_links": {
"self": {
"href": "/orders"
},
"next": {
"href": "/orders?page=2"
},
"search": {
"href": "/orders?id={order_id}"
}
}
}
If a Hal object has been created from a response returned from elsewhere it can be helpful to retrieve the links from it.
$json = '{
"customerId": "CUS1234",
"_links": {
"self": {
"href": "/orders"
},
"next": {
"href": "/orders?page=2"
},
"search": {
"href": "/orders?id={order_id}"
}
}
}';
$hal = \Nocarrier\Hal::fromJson($json);
foreach($hal->getLinks() as $rel => $links) {
echo $rel."\n";
foreach($links as $link) {
echo (string) $link."\n";
}
}
next
/orders?page=2
search
/orders?id={order_id}
and
$json = '{
"customerId": "CUS1234",
"_links": {
"self": {
"href": "/orders"
},
"next": {
"href": "/orders?page=2"
},
"search": {
"href": "/orders?id={order_id}"
}
}
}';
$hal = \Nocarrier\Hal::fromJson($json);
foreach($hal->getLink('next') as $link) {
echo (string) $link."\n";
}
outputs:
/orders?page=2
Embedded Resources
As well as linking to resources so that the client can fetch them they can be directly embedded in the resource.
$hal = new \Nocarrier\Hal('/orders', ['customerId' => 'CUS1234']);
$resource = new \Nocarrier\Hal(
'/orders/123',
array(
'total' => 30.00,
'currency' => 'USD',
)
);
$resource->addLink('customer', '/customer/bob', array('title' => 'Bob Jones <[email protected]>'));
$hal->addResource('order', $resource);
outputs:
{
"customerId": "CUS1234",
"_links": {
"self": {
"href": "/orders"
}
},
"_embedded": {
"order": [
{
"total": 30,
"currency": "USD",
"_links": {
"self": {
"href": "/orders/123"
},
"customer": {
"href": "/customer/bob",
"title": "Bob Jones <[email protected]>"
}
}
}
]
}
}
*Note that all licence references and agreements mentioned in the HAL README section above
are relevant to that project's source code only.