好久没有更新博客,最近在看某大佬网站的适合发现了RSS订阅的按钮,突然想起来这个东西也好几十年了,给自己的网站也弄一个吧。在弄之前大概的看了一下RSS的发展历史,结合了AI的能力捣鼓出本站的RSS源,后续再完善邮件订阅的功能。
首先是创建对应的RSS控制器,这个控制器负责将最近N条新的文章以XML的格式,并且符合RSS的标准。(这里是发布5条)

//RSS控制器
<?php
namespace app\index\controller;
use think\Controller;
use app\common\model\Article; // 引入模型
use app\common\helper\UrlHelper;
class Rss extends Controller
{
public function index(Request $request)
{
// 设置内容类型为 XML
header("Content-Type: application/rss+xml; charset=UTF-8");
// 从数据库获取数据,假设从文章表中获取
$articles = Article::where('status', 1)->order('publish_time', 'desc')->limit(5)->select();
// 最新文章发布时间
$latestArticle = Article::order('publish_time', 'desc')->find();
$pubDate = $latestArticle->publish_time;
// 生成 RSS XML
$rss = '<?xml version="1.0" encoding="UTF-8" ?>' . "\n";
$rss .= '<rss version="2.0">' . "\n";
$rss .= '<channel>' . "\n";
$rss .= '<title>柴宏俊web技术学习笔记</title>' . "\n";
$rss .= '<link>' . "https://chaihongjun.me/" . '</link>' . "\n"; // 网站链接
$rss .= '<description>记录chaihongjun学习web技术的个人博客,涉及的技术内容包括前端的javascript,vue,css,html后端的php和mysql数据库,以及一些linux服务器的运维知识</description>' . "\n";
$rss .= '<language>zh-CN</language>' . "\n";
$rss .= '<pubDate>' . date(DATE_RSS, strtotime($pubDate)) . '</pubDate>' . "\n";
foreach ($articles as $article) {
$rss .= '<item>' . "\n";
$rss .= '<title>' . htmlspecialchars($article['title']) . '</title>' . "\n";
$rss .= '<link>' . "https://chaihongjun.me" . UrlHelper::generateArticleUrl($article['id']) . '</link>' . "\n"; // 文章链接
$rss .= '<description>' . htmlspecialchars($article['introduction']) . '</description>' . "\n"; // 文章摘要
$rss .= '<category>' . UrlHelper::getCategoryNameByArticleId($article['id']) . '</category>' . "\n"; // 文章分类
$rss .= '<pubDate>' . date(DATE_RSS, strtotime($article['publish_time'])) . '</pubDate>' . "\n"; // 发布时间
$rss .= '</item>' . "\n";
}
$rss .= '</channel>' . "\n";
$rss .= '</rss>';
// 输出 RSS XML
// echo $rss;
responseXML($rss, 'xml');
}
}然后去路由那里配置一个新的路由:
// RSS
Route::get('rss.xml', 'index/Rss/index');于是在浏览器中直接访问地址 https://chaihongjun.me/rss.xml 即可,当然为了确保RSS源的正确,可以前往https://www.feedvalidator.org/ 进行验证。至此完成。
说明一下,上述控制器里用到的一些是自定义的函数:
function responseXML($content, $type = 'html')
{
if ($type === 'xml') {
header('Content-Type: application/xml; charset=utf-8');
}
echo $content;
exit;
}
public static function generateArticleUrl($articleId)
{
// 使用模型关联查询文章和对应的栏目
$article = Article::with('category')->find($articleId);
if ($article && $article->category) {
// 拼接URL
$url = '/' . $article->category->name . '/' . $article->id . '.html';
return $url;
}
return null;
}
public static function generateArticleUrl($articleId)
{
// 使用模型关联查询文章和对应的栏目
$article = Article::with('category')->find($articleId);
if ($article && $article->category) {
// 拼接URL
$url = '/' . $article->category->name . '/' . $article->id . '.html';
return $url;
}
return null;
}UrlHelper是一个自定义的公共助手工具类



