rnd-cosoft / api-tools-hal
Laminas模块,提供Hypermedia Application Language资源及其渲染
Requires
- php: ~8.1.0 || ~8.2.0 || ~8.3.0
- ext-json: *
- laminas/laminas-eventmanager: ^3.4.0
- laminas/laminas-filter: ^2.13.0
- laminas/laminas-http: ^2.15.1
- laminas/laminas-hydrator: ^3.2.0 || ^4.3.0
- laminas/laminas-mvc: ^3.3.0
- laminas/laminas-paginator: ^2.11
- laminas/laminas-stdlib: ^3.10.1
- laminas/laminas-uri: ^2.9.1
- laminas/laminas-view: ^2.14.0
- laminas/laminas-zendframework-bridge: ^1.1
- psr/link: ^1.0 || ^2.0
- rnd-cosoft/api-tools-api-problem: ^1.6.0
Requires (Dev)
- laminas/laminas-coding-standard: ~2.3.0
- laminas/laminas-modulemanager: ^2.10.1
- laminas/laminas-router: ^3.11
- phpdocumentor/reflection-docblock: ^5.2.2
- phpspec/prophecy-phpunit: ^2.0.1
- phpunit/phpunit: ^9.5.27
- psalm/plugin-phpunit: ^0.16.1
- vimeo/psalm: ^4.30
Replaces
This package is not auto-updated.
Last update: 2024-09-13 11:46:31 UTC
README
🇷🇺 俄罗斯公民
我们是Laminas的参与者,来自不同的国家。我们中许多人既有俄罗斯也有乌克兰的朋友、亲属和同事。其中一些人出生在俄罗斯。一些人现在住在俄罗斯。一些人祖父母在二战中与法西斯战斗过。在这里,没有人支持法西斯主义。
我们中有一个乌克兰亲属,她和儿子一起逃离了家园。火车因前方道路上的轰炸而延误。我们有朋友在防空洞里躲避。我们在空袭后焦急地等待他们的消息,空袭无差别地轰炸医院、学校、幼儿园和住宅。我们不是从任何媒体上得知这些。这是我们的亲身经历。
您足够信任我们使用我们的程序,我们请求您再次信任我们。我们需要帮助。走出家门,抗议这场无意义的战争。停止血腥。说“不战争!”
🇺🇸 致俄罗斯公民
我们Laminas来自世界各地。我们中许多人既有俄罗斯也有乌克兰的朋友、家人和同事。其中一些人出生在俄罗斯。一些人现在住在俄罗斯。一些人祖父母在二战中与纳粹战斗过。在这里,没有人支持法西斯主义。
我们团队中有一个乌克兰亲属,她和儿子一起逃离了家园。火车因前方道路上的轰炸而延误。我们有朋友在防空洞里躲避。我们在空袭后焦急地等待他们的消息,空袭无差别地轰炸医院、学校、幼儿园和住宅。我们不是从任何媒体上得知这些。这是我们的亲身经历。
您足够信任我们使用我们的软件。我们要求您信任我们说出真相。我们需要您的帮助。走出家门,抗议这场无意义的战争。停止杀戮。说“停止战争!”
简介
本模块提供了生成Hypermedia Application Language JSON表示的能力。
需求
请参阅composer.json文件。
安装
运行以下composer命令
$ composer require laminas-api-tools/api-tools-hal
或者,手动将以下内容添加到您的composer.json文件中的require部分
"require": { "laminas-api-tools/api-tools-hal": "^1.4" }
然后运行composer update以确保安装该模块。
最后,将模块名称添加到您的项目配置文件config/application.config.php中的modules键下
return [ /* ... */ 'modules' => [ /* ... */ 'Laminas\ApiTools\Hal', ], /* ... */ ];
laminas-component-installer
如果您使用laminas-component-installer,该插件将为您安装api-tools-hal作为模块。
配置
用户配置
此模块使用顶级键api-tools-hal进行用户配置。
键:renderer
这是一个用于配置api-tools-hal Hal视图助手/控制器插件的配置数组。它包含以下键
default_hydrator- 如果存在,则此命名的 hydrator 服务将作为默认 hydrator 由Hal插件使用,当为实体类配置没有 hydrator 时。render_embedded_entities- 布尔值,默认true,用于在 HAL 响应中渲染完整的嵌入式实体;如果false,则嵌入式实体将仅包含它们的关联链接。render_embedded_collections- 布尔值,默认为true,用于在 HAL 响应中渲染集合;如果为false,则只渲染集合的关系链接。hydrators- 一个将实体类名称映射到 hydrator 服务名称的映射,HAL 插件在实体恢复时可以使用。
键:metadata_map
元数据映射用于提示 HAL 插件如何渲染特定类类型的对象。当 HAL 插件遇到元数据映射中找到的对象时,它将使用该类的配置来创建表示;此信息通常指示如何生成关系链接,如何序列化对象,以及是否表示集合。
元数据映射中的每个类可能包含以下配置键之一或多个
entity_identifier_name- 用于标识符的类属性名称(在序列化后)。route_name- 用于生成集合或实体self关系链接的路线名称。route_identifier_name- 路线中使用的标识符名称,用于在 URI 路径中表示实体标识符。这通常与entity_identifier_name不同,因为路线中的每个变量段都必须具有唯一名称。hydrator- 序列化实体时使用的 hydrator 服务名称。is_collection- 布尔值;当类表示集合时设置为true。links- 用于构建关系链接的配置数组;请参阅以下链接的结构。entity_route_name- 集合嵌入实体的路线名称。route_params- 用于链接生成的路线参数数组。route_options- 链接生成期间传递给路由器的选项数组。url- 如果不使用路线,则使用此资源的特定 URL。max_depth- 整数;限制渲染实体和集合的嵌套级别;如果达到限制,则仅渲染self链接。默认值为null,表示没有限制:如果检测到无限循环引用,将抛出异常以避免无限循环。force_self_link- 布尔值;设置是否为实体自动生成自引用链接。默认值为true(因为它被推荐)。
links 属性是一个数组,每个数组具有以下结构
[
'rel' => 'link relation',
'url' => 'string absolute URI to use', // OR
'route' => [
'name' => 'route name for this link',
'params' => [ /* any route params to use for link generation */ .,
'options' => [ /* any options to pass to the router */ .,
.,
.,
// repeat as needed for any additional relational links
键:options
选项键用于配置 HAL 插件的一般选项。目前我们只有一个选项可用,包含以下配置键
use_proxy- 布尔值;当你使用代理(使用HTTP_X_FORWARDED_PROTO、HTTP_X_FORWARDED_HOST和HTTP_X_FORWARDED_PORT而不是SSL_HTTPS、HTTP_HOST, SERVER_PORT)时设置为true。
系统配置
以下配置用于确保在基于 Laminas 的应用程序中正确运行此模块。
// Creates a "HalJson" selector for use with laminas-api-tools/api-tools-content-negotiation 'api-tools-content-negotiation' => [ 'selectors' => [ 'HalJson' => [ 'Laminas\ApiTools\Hal\View\HalJsonModel' => [ 'application/json', 'application/*+json', ], ], ], ],
Laminas 事件
事件
Laminas\ApiTools\Hal\Plugin\Hal 事件管理器
Laminas\ApiTools\Hal\Plugin\Hal 在其生命周期中触发多个事件。从 HAL 插件中组合的 EventManager 实例,您可以附加以下事件
renderCollectionrenderCollection.postrenderEntityrenderEntity.postcreateLinkrenderCollection.entitygetIdFromEntity
例如,您可以像以下那样监听 renderEntity 事件(以下是在 Laminas 模块和/或 Laminas API Tools API 模块中的 Module 类中执行的)(
class Module { public function onBootstrap($e) { $app = $e->getTarget(); $services = $app->getServiceManager(); $helpers = $services->get('ViewHelperManager'); $hal = $helpers->get('Hal'); // The HAL plugin's EventManager instance does not compose a SharedEventManager, // so you must attach directly to it. $hal->getEventManager()->attach('renderEntity', [$this, 'onRenderEntity']); } public function onRenderEntity($e) { $entity = $e->getParam('entity'); if (! $entity->getEntity() instanceof SomeTypeIHaveDefined) { // do nothing return; } // Add a "describedBy" relational link $entity->getLinks()->add(\Laminas\ApiTools\Hal\Link\Link::factory([ 'rel' => 'describedBy', 'route' => [ 'name' => 'my/api/docs', ], ])); } }
关于个别事件的说明
renderCollection定义一个参数,collection,它是正在渲染的Laminas\ApiTools\Hal\Collection。renderCollection.post定义了两个参数:collection,表示正在渲染的Laminas\ApiTools\Hal\Collection,和payload,它是一个表示集合的ArrayObject,包括页数、大小、总项目和链接。renderEntity定义了一个参数,entity,表示正在渲染的Laminas\ApiTools\Hal\Entity。renderEntity.post定义了两个参数:entity,表示正在渲染的Laminas\ApiTools\Hal\Entity,和payload,它是一个表示实体的ArrayObject,包括链接。createLink定义了以下事件参数route,生成链接时使用的路由名称,如果有。id,生成链接时使用的实体标识值,如果有。entity,正在生成链接的实体,如果有。params,生成链接时使用的任何附加路由参数。
renderCollection.entity定义了以下事件参数collection,实体所属的Laminas\ApiTools\Hal\Collection。entity,当前正在渲染的实体;这可能或可能不是Laminas\ApiTools\Hal\Entity。route,当前实体的路由名称。routeParams,生成当前实体链接时使用的路由参数。routeOptions,生成当前实体链接时使用的路由选项。
getIdFromEntity定义了一个参数,entity,这是一个数组或对象,需要从中提取标识符。fromLink.pre(自 1.5.0 版本以来)定义了一个参数,linkDefinition,它是一个Laminas\ApiTools\Hal\Link\Link实例。这通常在Laminas\ApiTools\Rest\RestController::create()中有用,当你可能想要操纵自我关联的链接以生成Link标头时。
监听器
Laminas\ApiTools\Hal\Module::onRender
此监听器附加到 MvcEvent::EVENT_RENDER,优先级为 100。如果控制器服务结果为 HalJsonModel,则此监听器以优先级 200 将 Laminas\ApiTools\Hal\JsonStrategy 附加到视图。
Laminas 服务
模型
Laminas\ApiTools\Hal\Collection
Collection 负责将一般集合建模为 HAL 集合,并组成关系链接。
Laminas\ApiTools\Hal\Entity
Entity 负责将通用实体和普通对象建模为 HAL 实体,并组成关系链接。
Laminas\ApiTools\Hal\Link\Link
Link 负责建模关系链接。`Link` 类还有一个静态 factory() 方法,可以接受一个信息数组作为参数,以生成有效的 Link 实例。
Laminas\ApiTools\Hal\Link\LinkCollection
LinkCollection 是一个负责聚合一系列 Link 实例的模型。
Laminas\ApiTools\Hal\Metadata\Metadata
Metadata 负责收集创建 HAL 实体、链接或集合所需的所有必要依赖项、填充器和其它信息。
Laminas\ApiTools\Hal\Metadata\MetadataMap
MetadataMap 聚合了一个键为类名的 Metadata 实例数组,用于生成 HAL 实体、链接或集合。
提取器
Laminas\ApiTools\Hal\Extractor\LinkExtractor
LinkExtractor 负责从 Link 实例中提取链接表示。
Laminas\ApiTools\Hal\Extractor\LinkCollectionExtractor
LinkCollectionExtractor 负责提取一系列 Link 实例。它还组成一个 LinkExtractor 以提取单个链接。
控制器插件
Laminas\ApiTools\Hal\Plugin\Hal(又称“Hal”)
此类既作为视图助手也作为控制器插件运行。它负责为控制器提供生成 HAL 数据模型、渲染关系链接和 HAL 数据结构的工具。
视图层
Laminas\ApiTools\Hal\View\HalJsonModel
HalJsonModel 是一个视图模型,当它作为控制器服务响应的结果使用时,表示向 api-tools-hal 模块表明模型内部的数据应被用于生成 JSON HAL 表示。
Laminas\ApiTools\Hal\View\HalJsonRenderer
HalJsonRenderer 是一个视图渲染器,负责渲染 HalJsonModel 实例。反过来,这个渲染器将调用 Hal 插件/视图辅助器,以便将模型内容(一个 Entity 或 Collection)转换成 HAL 表示。
Laminas\ApiTools\Hal\View\HalJsonStrategy
HalJsonStrategy 负责在识别到控制器服务响应为 HalJsonModel 时选择 HalJsonRenderer。