[CakePHP4]ブログ記事の新着を外部から参照できるようにRSS2.0機能を実装する

[CakePHP4]ブログ記事の新着を外部から参照できるようにRSS2.0機能を実装する
2023年10月02日2023年10月10日 PR

最近RSSの存在意義がだいぶ減ってきていますが、CakePHP4でRSS2.0機能を実装したいと思います。

当ブログで導入した方法を紹介します。

当ブログもRSS機能を設けました

RSSリーダーとかで読み込めるようにRSS機能を実装しました。

下記が当ブログのRSSになります。

当ブログが気なる方はぜひ登録してくださいw

RSSを実装する

CakePHP4からデフォルトRSSヘルパーが廃止になっているなっているようです。

廃止の内容は公式の移行ガイドに記載されています。

認証機能がスタンドアロンのプラグイン Authentication および Authorization に分割されました。 以前の RssHelper については、同様の機能を持つスタンドアロンの Feed plugin をご覧ください。

参考:https://book.cakephp.org/4/ja/appendices/4-0-migration-guide.html

公式サイトに記載されている通りスタンドアロンを使用してとのことなので、スタンドアロンの「Feed plugin」を使用して実装します。

Feed pluginをcomposerでインストールする

下記composerコマンドを実行します。

composer require dereuromark/cakephp-feed

実装する

routes.phpファイルにrss用のrouteを定義します。

今回指定のパスのみ「.xml」のアクセスを許可するために下記のような書き方にしています。

~/config/routes.php
$routes->scope('/', function (RouteBuilder $builder) {

    // 下記のroute定義を追加する
    $builder->connect('/rss', ['controller' => 'Rss', 'action' => 'index'])->setExtensions(['xml']);
});

Rss用のControllerクラスを作成します。

~/src/Controller/RssController.php
<?php

namespace App\Controller;

use App\Consts\ArticleConst;
use Cake\Chronos\Chronos;
use Cake\Collection\Collection;
use Cake\Core\Configure;
use Cake\ORM\TableRegistry;
use Cake\Routing\Router;
use Cake\Utility\Text;

class RssController extends AppController
{

    public function initialize(): void
    {
        parent::initialize();

        $this->Articles = TableRegistry::getTableLocator()->get('Articles');
        $this->loadComponent('RequestHandler');
    }
    public function index()
    {

        $articles = $this->Articles
            ->find()
            ->andWhere([
                'status' => ArticleConst::STATUS_PUBLIC,
                'publiced <=' => Chronos::now()
            ])
            ->limit(20)
            ->order(['publiced' => 'desc'])->toArray();


        $data = [
            'channel' => [
                'title' => Configure::read("App.name"),
                'link' => Router::url('/', true),
                'description' => Configure::read("App.description"),
                'language' => 'ja',
                'lastBuildDate' => (new Collection($articles))->first()->publiced,
                'docs' => Router::url(null, true), //rssURL

            ],
        ];
        foreach ($articles as $article) {
            $data['items'][] = [
                'title' => $article->title,
                'link' => Router::url(["controller" => "Articles", 'action' => 'view', "id_str" => $article->id_str], true), //リンク先
                'description' => Text::truncate(strip_tags($article->body), 100),
                'pubDate' => $article->publiced, //公開日時

            ];
        }
        $this->viewBuilder()->setClassName('Feed.Rss');        // 追加したプラグインを指定
        $this->set(['data' => $data, '_serialize' => 'data']); // 描画用に必要
    }
}

最後の下記2行が重要です。

$this->viewBuilder()->setClassName('Feed.Rss');        // 追加したプラグインを指定
$this->set(['data' => $data, '_serialize' => 'data']); // 描画用に必要
レイアウトファイルやViewファイル(template)の準備は不要です。自動でxml形式で出力してくれます。

RSSのフィールド項目は、RSSの仕様を確認して追加したり削除したりしてください。

動作確認

routes.phpファイルに記載したパスでアクセスください。

本記事通り実装している場合は、「/rss.xml」でアクセスすることで動作確認できます。

https://localhost/rss.xml

下記のように出力できていれば完成です。

<rss version="2.0">
  <channel>
    <title>コードサプリ</title>
    <link>https://codesapuri.com/</link>
    <description>Web開発しならが困ったことや解決したことを備忘録として書いています。</description>
    <language>ja</language>
    <lastBuildDate>2023/10/01 18:12</lastBuildDate>
    <docs>https://codesapuri.com/rss.xml</docs>
    <item>
      <title>[MySQL]テーブルからの奇数行または偶数行を分けて取得する方法</title>
      <link>https://codesapuri.com/articles/odd-even-mysql</link>
      <description>データを分割して取得したい時があります。そこでテーブルから奇数行と偶数行を分けて取得する方法を紹介します。 ちなみに奇数行と偶数行以外に3分割や5分割なども取得することも可能です。 ...</description>
      <pubDate>Sun, 01 Oct 2023 18:12:34 +0900</pubDate>
    </item>
    <item>
      <title>CakePHP 4.3にアップデートしたらRouter::prefix()が非推奨となり、Deprecatedエラーが表示される場合の解決方法</title>
      <link>https://codesapuri.com/articles/cakephp4-router-prefix-deprecated</link>
      <description>CakePHP4.2からCakePHP4.3をアップデートをおこなったらconfig/routes.phpのRouter::prefix()記述部分でDeprecatedが発生するようになりまし...</description>
      <pubDate>Sat, 30 Sep 2023 10:42:01 +0900</pubDate>
    </item>
  </channel>
</rss>

外部からRSSを検知できるようにheadタグにrssリンクを定義する

RSS機能が実装できたら、外部サービスやツールから検知できるようにhtmlのheadタグ内にrssリンクの定義を追加します。

<link rel="alternate" type="application/rss+xml" title="コードサプリ" href="https://codesapuri.com/rss.xml">

正常に動作しているか確認したい場合 

RSSフィードを取得検出してくれるサービスがあります。こちらを使用して動作確認ができます。

※ headタグにリンクタグを埋め込んでおく必要があります。

参考:RSSフィード取得・検出ツール

 まとめ

CakePHP4でRSS2.0機能の実装方法を紹介しました。

外部ライブラリを使用することで簡単に実装することができます。ぜひ試してみてください。

コメント

コメントを残す

お名前(任意)
コメント:新規