koriym/hal
Composer 安装命令:
composer require koriym/hal
包简介
application/hal builder / formatter for PHP 8.2+
关键字:
README 文档
README
Note: This is a temporary fork to provide PHP 8.2+ support while PR #64 is pending review.
This is a library for creating documents in the application/hal+json and application/hal+xml hypermedia formats
It requires PHP 8.2 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 <bob@jones.com>')); $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 <bob@jones.com>')); $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 <bob@jones.com>"
}
}
}
]
}
}
koriym/hal 适用场景与选型建议
koriym/hal 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 37.16k 次下载、GitHub Stars 达 0, 最近一次更新时间为 2025 年 11 月 11 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「json」 「xml」 「rest」 「hal」 「hypermedia」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 koriym/hal 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 koriym/hal 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 koriym/hal 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Kinikit - PHP Application development framework MVC component
ext-json wrapper with sane defaults
A package to cast json fields, each sub-keys is castable
Load DOM document safety
A PSR-7 compatible library for making CRUD API endpoints
Api bundle
统计信息
- 总下载量: 37.16k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 33
- 依赖项目数: 1
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2025-11-11