好久没有更新博客,最近在看某大佬网站的适合发现了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是一个自定义的公共助手工具类