首页 >php框架 >Laravel > 正文

如何用laravel生成sitemap

转载2020-01-15 14:39:2301056
之前用yaf和yii框架写过sitemap:思路是根据需求生成.xml文件保存到项目指定目录中。

用laravel换一个思路,生成.xml动态链接,而不是保存文件到目录

1.配置routes,生成xml访问链接

2.根据项目逻辑生成sitemap

上代码:

配置routes

    //sitemap
    Route::get('/sitemap/m/{type}.xml', 'SitemapController@siteMap');

核心代码

<?php
namespace App\Http\Controllers\M;
use App\Http\Controllers\BaseController;
use App\Model\Bbs\Article;
use App\Model\Bbs\Ask;
use App\Model\Bbs\Thread;
use App\Model\Main\Video;
use App\Model\Garage\SeriesInfoModel;
//todo 补充其他模块
use Carbon\Carbon;
use Illuminate\Support\Facades\Cache;
class SitemapController extends BaseController
{
    //todo 写一个汇总文件
    public function siteMap($type)
    {
        $cacheKey = "site-" . $type;
        //2小时缓存 保证加载速度
        if (Cache::has($cacheKey)) {
            $siteMap = Cache::get($cacheKey);
        } else {
            $siteMap = $this->buildSiteMap($type);
            Cache::add($cacheKey, $siteMap, 120);
        }
        return response($siteMap)
            ->header('Content-type', 'text/xml');
    }
    /**
     * Build the Site Map
     */
    protected function buildSiteMap($type)
    {
        $sitemapInfo = [];
        switch ($type) {
            case 'video':
                $sitemapInfo = $this->getVideoInfo();
                break;
            case 'article':
                $sitemapInfo = $this->getArticleInfo();
                break;
            case 'bbs':
                $sitemapInfo = $this->getBbsInfo();
                break;
            case 'ask':
                $sitemapInfo = $this->getAskInfo();
                break;
            case 'series':
                $sitemapInfo = $this->getSeriesInfo();//车型库
                break;
        }
        $lastmod = $sitemapInfo[0]['pub_time'];
        $xml = [];
        $xml[] = '<?xml version="1.0" encoding="UTF-8"?' . '>';
        $xml[] = '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:mobile="http://www.baidu.com/schemas/sitemap-mobile/1/">';
        $xml[] = '  <url>';
        $xml[] = "    <loc>https://m.xxx.com</loc>";
        $xml[] = "    <lastmod>$lastmod</lastmod>";
        $xml[] = '    <changefreq>daily</changefreq>';
        $xml[] = '    <priority>0.8</priority>';
        $xml[] = '  </url>';
        foreach ($sitemapInfo as $sitemap) {
            $xml[] = '  <url>';
            $xml[] = "    <loc>{$sitemap['url']}</loc>";
            $xml[] = "    <mobile:mobile type=\"mobile\"/>";
            $xml[] = "    <lastmod>{$sitemap['pub_time']}</lastmod>";
            $xml[] = "  </url>";
        }
        $xml[] = '</urlset>';
        return join("\n", $xml);
    }
    /**
     * Return all the posts as $url => $date
     */
    protected function getVideoInfo()
    {
        $videos = Video::where('pub_time', '<=', Carbon::now())
            ->where('published', 2)
            ->where('is_del', 0)
            ->orderBy('id', 'desc')
            ->pluck('pub_time', 'id')
            ->all();
        $res = $article = [];
        foreach ($videos as $id => $pub_time) {
            $article['id'] = $id;
            $article['pub_time'] = substr($pub_time, 0, 10);
            $article['url'] = "https://m.xxx.com/video_" . $id . ".html";
            $res[] = $article;
        }
        return $res;
    }
    protected function getArticleInfo()
    {
        $articles = Article::where('pub_time', '<=', Carbon::now())
            ->where('published', 2)
            ->where('is_del', 0)
            ->orderBy('id', 'desc')
            ->pluck('pub_time', 'id')
            ->take(5000)
            ->all();
        $res = $article = [];
        foreach ($articles as $id => $pub_time) {
            $article['id'] = $id;
            $article['pub_time'] = substr($pub_time, 0, 10);
            $article['url'] = "https://m.xxx.com/news/article_" . $id . ".html";
            $res[] = $article;
        }
        return $res;
    }
    protected function getBbsInfo()
    {
        $articles = Thread::where('visible', 1)
            ->where('is_del', 0)
            ->orderBy('id', 'desc')
            ->pluck('dateline', 'id')
            ->take(10000)
            ->all();
        $res = $article = [];
        foreach ($articles as $id => $pub_time) {
            $article['id'] = $id;
            $article['pub_time'] = substr($pub_time, 0, 10);
            $article['url'] = "https://m.xxx.com/bbs/thread_" . $id . ".html";
            $res[] = $article;
        }
        return $res;
    }
    protected function getAskInfo()
    {
        $articles = Ask::where('state', 1)
            ->orderBy('id', 'desc')
            ->pluck('dateline', 'id')
            ->take(10000)
            ->all();
        $res = $article = [];
        foreach ($articles as $id => $pub_time) {
            $article['id'] = $id;
            $article['pub_time'] = substr($pub_time, 0, 10);
            $article['url'] = "https://m.xxx.com/ask_" . $id . ".html";
            $res[] = $article;
        }
        return $res;
    }
    //车型库
    protected function getSeriesInfo()
    {
        $articles = SeriesInfoModel::where('status', 1)
            ->where('is_stop', 0)
            ->pluck('name', 'id')
            ->all();
        $res = $article = [];
        foreach ($articles as $id => $pub_time) {
            $article['id'] = $id;
            $article['pub_time'] = date('Y-m-d', time());
            $article['url'] = "https://m.xxx.com/series/" . $id . "/details";
            $res[] = $article;
        }
        return $res;
    }
}

更多laravel框架相关技术文章,请访问laravel教程栏目!

以上就是如何用laravel生成sitemap的详细内容,更多请关注php中文网其它相关文章!

php中文网最新课程二维码
  • 相关标签:laravel
  • 本文转载于:csdn,如有侵犯,请联系a@php.cn删除
  • 相关文章

    相关视频


    网友评论

    文明上网理性发言,请遵守 新闻评论服务协议

    我要评论
  • 在应程序中,经常需要全局唯一的ID作为数据库主键,全局唯一ID,本篇文章教大家实现。
    下面由Laravel​教程栏目给大家介绍使Laravel图片处理包intervention-image,希望对需要的朋友有所帮助!
    java1到100之间的随机数的方法:可以使random()方法来实现,【int i = (int)(Math.random()*100+1);】。
    Python随机10个整数的方法:可以使random类中的sample()方法,【index = random.sample(range(0,10),10)】,表示随机10个不重复的范围在1
    在C语言中是1~100的随机数的呢?想必大家都想了解一下吧,那么话不多说,跟着小编一起了解一下吧。
    在PHP网站开发中为了网站推广和SEO等需要,需要对网站进行全站或局部静态化处理,PHP静态HTML页面有多种方法,比PHP模板、缓存等实现页面静态化,今天就以PHP实例教程形式讨论PHP静态页面的方法
    使excel中性别公式的方法:1、在新建表格中输入公式【IF(MOD(MID(C3,17,1),2)=1,"男","女")】;2、果使的是if函数公式插入
    dede中google sitemap功能的使方法:首先进入“dede”后台;然后依次选择“更新自由列表-管理自由列表-增加列表”;接着修改有关参数并sitemap”即可。
    果要在smarty模板中随机数,该办呢,在php文件中然后赋值到模板中。
    下面由Laravel教程栏目给大家介绍Laravel命周期,希望对需要的朋友有所帮助!世间万物皆有命周期,当我们使工具时都需要理解它的工作原理,那么起来就会得心应手,应开发也是此。
    写给初牛犊不怕虎的童鞋们,大佬可随意摘看,本章基于PHP Laravel,经常会有人问目录设计比较好? 代码分布好? 怎么写一个可维护的项目? “烂”项目我也没少写,本文将提供些小技巧。
    U方法是ThinkPHP内置的一个快捷方法,可以根据系统URL模式配置动态的智能的URL地址。本文就来介绍一下使U方法自动url超链接。
    这篇文章主要为大家介绍了帝国CMS网站sitemap制作方法,涉及采灵动标签调数据库信息及XML文件的方法,是进行网站SEO非常实的技巧,需要的朋友可以参考下
    本篇文章是使PHPStorm编辑器开发Laravel应的详解,给大家介绍了关于利PHPStorm开发Laravel的相关资料,文中通过示例代码介绍的非常详细。

    2020-02-03

    846

    javajar的方法:1、编写一个测试类,并编译为class文件;2、进入class文件的父级目录,输入jar -cvf [jar包的名字] [需要打包的文件]即可完打包。
    使eclipsejava文档的方法:首先进入到“project”下的“generate javadoc”选项,然后设置“javadoc”程序,选择要文档的java项目和文档输出目录,最后设置文档编码即可
    而这些通的接口已经由Laravel为你设计好了。就是这些Contracts.那么Laravel知道我们需要使哪个实现呢?
    本文是讲解js的随机数,大家都知道有多种方法体的使,文章中都一一罗列了主要的方法的使,并详细介绍了随机字符串,希望可以帮助大家。
    PHP金字塔的整个过程:1、金字塔的效果图;2、代码实现过程;3、逻辑实现。
    DEDE5.7单页文档XML的方法:首先新建一个后缀为htm的模板文件;然后在dede后台中增加一个页面为xml;接着替换新建的htm模板内容即可。

    专题推荐

    推荐视频教程
  • javascript初级视频教程javascript初级视频教程
  • jquery 基础视频教程jquery 基础视频教程
  • 视频教程分类