rnr1721 / le7-links
PSR LinkInterface 实现用于 le7 MVC 框架或任何 PHP8 PSR 项目
Requires
- php: >=8.1
- psr/http-message: ^2.0
- psr/link: ^2.0
Requires (Dev)
- phpunit/phpunit: ^10.0
- vimeo/psalm: ^5.7
Provides
README
PSR LinkInterface 实现用于 le7 MVC 框架或任何 PHP8 PSR 项目 这不是“干净”的实现,这是 EnvolvedLinkInterface、UriInterface 和自家的 ULinkInterface 的组合。
要求
- PHP 8.1
- Composer
安装
composer require rnr1721/le7-links
测试
composer test
用法
链接
Link 类代表一个 LinkInterface、UriInterface 和自家的 ULinkInterface,具有操作 URI 和渲染 HTML 链接标签的附加功能。
首先,导入 Link 类
use Core\Links\Link;
通过提供 URI、链接关系类型和附加属性来创建 Link 类的实例
$link = new Link('https://example.com/page1', ['rel1'], ['attribute1' => 'value1']);
检索 URI 组件
您可以使用以下方法检索 URI 的不同组件
$scheme = $link->getScheme(); $authority = $link->getAuthority(); $userInfo = $link->getUserInfo(); $host = $link->getHost(); $port = $link->getPort(); $path = $link->getPath(); $query = $link->getQuery(); $fragment = $link->getFragment();
修改 URI 组件
您可以使用以下方法创建链接的修改版本
$newLink = $link->withScheme('https'); $newLink = $link->withUserInfo('username', 'password'); $newLink = $link->withHost('example.com'); $newLink = $link->withPort(8080); $newLink = $link->withPath('/new-path'); $newLink = $link->withQuery('param1=value1¶m2=value2'); $newLink = $link->withFragment('section1');
渲染 HTML 链接标签
要渲染链接为 HTML 链接标签,请使用 render 方法
$html = $link->render();
render 方法返回包含 HTML 链接标签的字符串。
链接属性
您可以使用以下方法检索和修改链接的关系类型和附加属性
$rels = $link->getRels();
$hasRel = $link->hasRel('rel1');
$attributes = $link->getAttributes();
$href = $link->getHref();
$isTemplated = $link->isTemplated();
$attributeValue = $link->getAttribute('attribute1');
您可以使用以下方法创建带有更新关系类型和属性的链接的修改版本
$newLink = $link->withHref('https://example.com/page2'); $newLink = $link->withRel('rel2', 'rel3'); $newLink = $link->withoutRel('rel1'); $newLink = $link->withAttribute('attribute2', 'value2'); $newLink = $link->withoutAttribute('attribute1');
字符串转换
您可以使用 magic __toString 方法获取链接的字符串表示形式
$string = (string)$link;
链接提供者
LinkProvider 类是 PSR-Link 库中 EvolvableLinkProviderInterface 的实现。它用于存储和管理链接。
首先,导入 LinkProvider 类
use Core\Links\LinkProvider;
创建 LinkProvider 类的实例
$linkProvider = new LinkProvider();
添加链接
要将链接添加到提供者,请使用 withLink 方法
use Core\Links\Link; $link = new Link('https://example.com/page1', ['rel1'], ['attribute1' => 'value1']); $linkProvider = $linkProvider->withLink($link);
您可以使用多个 withLink 调用来添加多个链接
$link1 = new Link('https://example.com/page1', ['rel1'], ['attribute1' => 'value1']); $link2 = new Link('https://example.com/page2', ['rel2'], ['attribute2' => 'value2']); $linkProvider = $linkProvider->withLink($link1) ->withLink($link2);
检索链接
要检索提供者中的所有链接,请使用 getLinks 方法
$links = $linkProvider->getLinks();
getLinks 方法返回一个包含 LinkInterface 对象的数组。
删除链接
要从提供者中删除链接,请使用 withoutLink 方法
$linkProvider = $linkProvider->withoutLink($link);
过滤链接
要基于关系检索链接,请使用 getLinksByRel 方法
$filteredLinks = $linkProvider->getLinksByRel('rel1');
getLinksByRel 方法返回一个包含具有指定关系的 LinkInterface 对象的数组。
添加多个链接
要一次性添加多个链接,请使用 withLinks 方法
$links = [ new Link('https://example.com/page1', ['rel1'], ['attribute1' => 'value1']), new Link('https://example.com/page2', ['rel2'], ['attribute2' => 'value2']), ]; $linkProvider = $linkProvider->withLinks($links);
删除多个链接
要一次性删除多个链接,请使用 withoutLinks 方法
$linkProvider = $linkProvider->withoutLinks($links);
withoutLinks 方法接受一个 LinkInterface 对象数组,并将它们从提供者中删除。