のんラボ

TDDでRSSを生成するライブラリを作成した話

2020/11/27 2020/11/27 TDDでRSSを生成するライブラリを作成した話

TDDでRSSを生成するライブラリを作成した話

こんにちは。Nonです。

前回に引き続き、TDDでRSSを作成するライブラリについて話をしてみたいと思います。

完成したもの

https://github.com/nonz250/simple-rss-maker-php

https://packagist.org/packages/nonz250/simple-rss-maker-php

構造

RSS1.0に対応する余地を残しているので、SimpleRssMakerクラスの構造が少しおかしいかも。

ユースケース層も作ったけど、これいらなかったかなー。でもファイルを作成する処理をここに書きたかったので、まぁ良しとしましょう。

RSS1.0に対応していないですが、一応composerからはinstallできるようにしてる

バージョンとしては1.0.0として作成しました。

https://packagist.org/packages/nonz250/simple-rss-maker-php

しかし、RSS1.0にはまだ対応してないです。(RSS2.0の利用のほうが多いみたいだし別にいいよね😅)

構造的に悩んだところ

ChannelをEntityにしたけどよく考えたらValueObejctなのかな?もっとシンプルな構造にすべきだったかも。DDDに固執しすぎた感ある。うーん。配列は作成したくなかったので、クラスにするのはあってるけどEntityとして定義するのは間違えた気がする。

SimpleXMLElementをつかってRSSを作成したのは、余計なstringとかで書かなくて済んだので良かったと思う。

RSS2エンティティの振る舞いだけで十分だったかなと思いました。

使い方

Packagistにも書いてありますが、

$simpleRssMaker = new SimpleRssMaker();

$xml = $simpleRssMaker
    // Channel settings.
    ->setChannel('title', 'link', 'description', 'language', 'copyright', 'category', 'pubDate')
    // Image settings.
    ->setImage('title', 'link', 'url')
    // Item settings.
    ->addItem('title', 'link', 'description', 'author', 'category', 'datetime')
    ->addItem('title', 'link')
    // Generate RSS2.0 string.
    ->rss2();

// If you have more than one article.
$simpleRssMaker = $simpleRssMaker
    // Channel settings.
    ->setChannel('title', 'link', 'description', 'language', 'copyright', 'category', 'pubDate')
    // Image settings.
    ->setImage('title', 'link', 'url');

foreach($items as $item) {
    $simpleRssMaker = $simpleRssMaker
        ->addItem('title', 'link', 'description', 'author', 'category', 'datetime');
}

// Generate RSS2.0 string.
$xml = $simpleRssMaker->rss2();

こんな感じ。SimpleRssMakerだけで全部設定できるように作成しました。

最初の頃はChannelFactoryとか作ってChannelクラスをユーザーに使用してもらおうと思ってたけど、使いにくいかなと思ってやめました。

最後に

フィード系のライブラリは他にも結構いいのがあったけど、総じてPHP5.3とかのライブラリだったので、差別化は出来てるかなと思っています。(PHP7.4以上が対象です。)

RSS1.0に対応はしたいけどAtomは別にいいかな...

ということで、しょぼいけどOSS作れてよかったと思いました。

そろそろ私も色々な人に貢献していきたいなとおもいますので、他のパッケージも作って行きたいと思います。

そのときはよしなに。

.