ridiculouscircumstances/sm-generator
一个用于生成网站地图的简单库。
Requires
- ext-dom: *
Requires (Dev)
- phpunit/phpunit: 10.0.x-dev
This package is not auto-updated.
Last update: 2024-10-01 11:38:27 UTC
README
一个用于在项目中快速生成网站地图的简单库。
快速入门
要开始使用网站地图生成器,只需安装并导入它
composer require ridiculouscircumstances/sm-generator
然后
use Rc/SmGeneration/Sitemap;
首先,创建并将类似数组的您的数据添加到生成器中,然后选择输出文件的类型,并获取保存文件的路径数组
use Rc/SmGeneration/Sitemap;
///
$paths = Sitemap::create()->add([
'loc' => 'ftp://site.ru',
'lastmod' => '2020-11-12',
'changefreq' => 'daily',
'priority' => '1',
],
[
'loc' => 'http://site.ru',
'lastmod' => '2020-11-12',
'changefreq' => 'monthly',
'priority' => '0.4',
])
->writeToJson('sitemap')
->writeToXml('sitemap)
->writeToCsv('sitemap')
->getPaths();
这就是全部。
注意:默认的保存文件路径由您项目的当前目录决定。如果您想指定路径,请将其传递给“writeTo”方法的第二个参数。
如您所注意到的,支持链式调用,每个方法都返回 Sitemap 类的实例。默认情况下,输入数据表示为具有以下键的关联数组
- 'loc' - 资源 URL 地址,
- 'lastmod' - 资源最后修改日期,
- 'changefreq' - 显然,资源更新的频率,
- 'priority' - 页面优先级值,搜索引擎在评估单个网站内的页面时使用。
因此,生成器接受上述参数并执行数据验证:每个参数必须符合特定的格式规则。规则通过附加到数据传输对象的属性来定义,并且您可以灵活地自定义自己的规则和数据模式。让我们简要看看底层的处理过程。
验证
数据对象如下所示
class PageData
{
public function __construct(
#[Url] <--------- Validation rule attribute
public string $loc, <--------- The corresponding property with the same name as in the input array
#[Date]
public string $lastmod,
<...>
) {}
}
如您所见,PageData 是一个普通对象,如果您想定义自己的一个,可以很容易地做到,只需创建一个自定义类并将其对象注入 Sitemap 的 add 方法。或者重写现有类
class Sitemap
{
<...>
public function add (array $pages): Sitemap
{
<...>
foreach ($pages as $page) {
$this->pages [] = Executor::validate(new PageData( <--------- Our pretty DTO is here!
...$page
)) ?? [];
<...>
}}
但如果您决定使用自己的规则呢?那么您应该查看任何实现了 ValidationRule 接口的类。这是接口
interface ValidationRule
{
public function __invoke (mixed $property, string $propertyName );
}
在壳子里,整个验证逻辑如下。实现了 ValidationRule 接口的类通过实现 ValidationAttribute 类的 GetValidator 方法实例化并返回
interface ValidationAttribute
{
public function getValidator (): ValidationRule;
}
然后,通过将每个 DTO 属性传递给验证器的 __invoke 方法来进行验证数据。
Executor 类通过类反射管理此过程。如果验证成功,Executor 返回与之前传递用于验证相同的数组。否则,返回错误。
一旦您编写了自定义验证规则及其属性,只需将其放在 DTO 的属性上即可
#[Attribute(Attribute::TARGET_PROPERTY)]
class CustomAttribute implements ValidationAttribute
{
public function GetValidator (): ValidationRule {
return new CustomRule();
}}
///
class CustomRule implements ValidationRule
{
public function __invoke(mixed $property, string $propertyName) {
// some validation logic
}}
///
class CustomData
{
public function __construct(
#[CustomAttribute]
public string $customProperty
) {}
}
输出写入
验证成功后,在 Sitemap 内部调用写入文件的相应方法。目前有三种可能的写入类型:写入 json、csv 和 xml。
每个方法将写入命令委托给特殊的写入器类。每个写入器都扩展了抽象 Writer 类,其中包含以下常见写入逻辑
abstract class Writer
{
<...>
protected static function write (array $content, string $name, ?string $path): string|null
{ <...>
self::checkContent($content);
$path = self::setPath($name, $path);
$output = static::build($content);
return self::save($path, $output);
<...>
}
<...>
常见逻辑包括
- 检查非空输入数据,
- 路径创建(如果路径已存在,则返回该路径,或创建新的路径。如果没有传递路径,则使用默认路径),
- 保存到文件。
子类(例如 XmlWriter、JsonWriter 等)只知道如何构建自己的数据格式,这是在它的 "build" 方法中实现的,该方法是抽象 Writer 类通过静态指针调用的。子类不知道其他内容。
这种设计方法使得只需在子类中编写其特殊的数据格式构建逻辑即可轻松更改写入器或添加新的写入器。
例如
class CustomWriter extends Writer
{
protected static string $ext = 'custom type';
protected static function build (array $content): string
{
//custom logic
}
}
然后您需要做的只是将自定义写入器添加到 Sitemap 的自定义 "writeTo" 方法中
class Sitemap
{
<...>
public function writeToCustomType (...args) {
$this->paths [] = CustomWriter::write(...args);
return $this;
}
<...>
}
因此,该库不仅允许您快速轻松地生成网站地图,而且也便于修改。