jantaodev/sitemap-bundle

Symfony 扩展包,用于生成 sitemap XML

安装: 145

依赖: 0

建议者: 0

安全: 0

星标: 0

关注者: 0

分支: 0

公开问题: 0

类型:symfony-bundle

0.2 2022-01-17 12:15 UTC

This package is not auto-updated.

Last update: 2024-09-24 02:34:09 UTC


README

这个 Symfony 扩展包提供了 sitemap XML 生成功能。

功能

  • 高级 robots.txt 配置
  • 支持多个主机
  • 可选的 sitemap GZip 压缩
  • 支持 sitemap 约束(每个文件10 MBytes/50,000项)
  • 路由参数迭代

要求

  • PHP 7.2
  • Symfony 5
  • Doctrine 2

1. 安装

运行 composer require jantaodev/sitemap-bundle

app/AppKernel.php 文件中注册扩展包(可选)

...
public function registerBundles()
{
    $bundles = array(
        ...
        new JantaoDev\SitemapBundle\JantaoDevSitemapBundle(),
        ...
    );
...

app/config/parameters.yml 中添加主机名

parameters:
    ...
    router.request_context.host:   example.com
    router.request_context.scheme: http

app/config/config.yml

...
jantao_dev_sitemap:
    hosts:
        - example.com

现在您可以使用这个扩展包。

2. 基本使用

有多种方式可以将路由添加到 sitemap 中。

2.1. 注解、yaml、XML(用于无参数的静态路由)

注解简单示例

/**
 * @Route("/", name="homepage", options={"sitemap" = true})
 */

yaml 简单示例

homepage:
    path: /
    defaults: { _controller: "AppBundle:Default:index" }
    options:
        sitemap: true

XML 简单示例

<route id="homepage" path="/">
    <default key="_controller">AppBundle:Default:index</default>
    <option key="sitemap">true</option>
</route>

注解完整示例

/**
 * @Route("/", name="homepage", options={"priority" = 0.5, "changeFreq" = "monthly", "lastMod" = "2017-02-23T13:14:15+02:00" })
 */

yaml 完整示例

homepage:
    path: /
    defaults: { _controller: "AppBundle:Default:index" }
    options:
        sitemap:
            priority: 0.5
            changeFreq: monthly
            lastMod: "2017-02-23T13:14:15+02:00"

XML 完整示例

<route id="homepage" path="/">
    <default key="_controller">AppBundle:Default:index</default>
    <option key="sitemap">
        {"priority":"0.5", "changeFreq":"monthly", "lastMod":"2017-02-23T13:14:15+02:00"}
    </option>
</route>

有三个参数

并非必须指定所有参数。

2.2. app/config/config.yml 中的扩展包配置

静态路由的简单示例

jantao_dev_sitemap:
    ...
    sitemap:
        homepage: ~

静态路由的完整示例

jantao_dev_sitemap:
    ...
    sitemap:
        homepage:
            priority: 0.5
            change_freq: monthly
            last_mod: "2017-02-23T13:14:15+02:00"

带有参数的动态路由的完整示例

jantao_dev_sitemap:
    ...
    sitemap:
        homepage:
            priority: 0.5
            change_freq: monthly
            last_mod: "2017-02-23T13:14:15+02:00"
            route_parameters:
                slug: "someslug"

使用数组迭代器迭代路由参数的数据

jantao_dev_sitemap:
    ...
    sitemap:
        homepage:
            iterator: array
            values:
                - slugone
                - slugtwo
                - slugthree
            priority: 0.5
            change_freq: monthly
            last_mod: "2017-02-23T13:14:15+02:00"
            route_parameters:
                slug: "->"

使用数组迭代器迭代路由参数的数据(示例2)

jantao_dev_sitemap:
    ...
    sitemap:
        homepage:
            iterator: array
            values:
                - {slug: slugone, change: monthly}
                - {slug: slugtwo, change: hourly}
                - {slug: slugthree, change: dayly}
            priority: 0.5
            change_freq: "->change"
            last_mod: "2017-02-23T13:14:15+02:00"
            route_parameters:
                slug: "->slug"

使用 Doctrine 迭代器迭代路由参数的数据

jantao_dev_sitemap:
    ...
    sitemap:
        homepage:
            iterator: doctrine
            query: 'SELECT p FROM AppBundle:Page p WHERE p.enabled = true'
            priority: 0.5
            change_freq: monthly
            last_mod: "->modifiedAt"
            route_parameters:
                slug: "->slug"
                categorySlug: "->category->slug"

3. 执行 sitemap 生成

有两种方式可以执行 sitemap 生成

  1. 通过控制台
bin/console jantao_dev:sitemap:generate
  1. 通过服务
$this->get('jantao_dev.sitemap')->generate();

4. 高级配置

完整的扩展包配置

jantao_dev_sitemap:
    hosts:
        - example.com
    gzip: false
    scheme: https
    robots:
        # Robots.txt configuration
    sitemap:
        # Sitemap configuration

参数描述

  • https_only 表示站点仅通过 https 访问

4.1. robots.txt 配置

完整的 robots.txt 配置

jantao_dev_sitemap:
    ...
    robots:
        allow:
            "/ajax/": ~
            "/system/": "Googlebot"
        disallow:
            "/admin/": ~
            "/otherpath": "Googlebot"
        crawl_delay: 5
        clean_param:
            "/photo": ["query=1", "page=2"]

参数描述

有关 robots.txt 参数的更多详细信息,请参阅

4.2. 多个主机支持

多个主机支持允许您为多个主机生成不同的 sitemap。

因此,启用多个主机支持,在扩展包配置中列出您的宿主机

jantao_dev_sitemap:
    ...
    hosts:
        example.com
        foo.com
        bar.com

在路由器中启用 robots.txt 切换控制器(向 app/config/routing.yml 中添加以下行)

jantao_dev_sitemap:
    resource: "@JantaoDevSitemapBundle/Resources/config/routing.xml"
    prefix:   /

默认情况下,所有路由都将添加到每个宿主机的 sitemap 中。

但在扩展包配置中的 sitemap 部分,您可以指定宿主机。

示例

jantao_dev_sitemap:
    ...
    hosts:
        example.com
        foo.com
        bar.com
    ...
    sitemap:
        homepage: ~
        about@foo.com: ~

在这个示例中,主页将被添加到所有 sitemap 中,但关于页面仅被添加到 "foo.com" 的 sitemap 中。

示例 2(不同的 slugs)

jantao_dev_sitemap:
    ...
    hosts:
        example.com
        ru.example.com
        de.example.com
    ...
    sitemap:
        homepage@example.com:
            iterator: doctrine
            query: 'SELECT p FROM AppBundle:Page p WHERE p.enabled = true'
            priority: 0.5
            change_freq: monthly
            last_mod: "->modifiedAt"
            route_parameters:
                slug: "->slugEn"
        homepage@ru.example.com:
            iterator: doctrine
            query: 'SELECT p FROM AppBundle:Page p WHERE p.enabled = true'
            priority: 0.5
            change_freq: monthly
            last_mod: "->modifiedAt"
            route_parameters:
                slug: "->slugRu"
        homepage@de.example.com:
            iterator: doctrine
            query: 'SELECT p FROM AppBundle:Page p WHERE p.enabled = true'
            priority: 0.5
            change_freq: monthly
            last_mod: "->modifiedAt"
            route_parameters:
                slug: "->slugDe"

5. 添加自定义事件监听器

要使用您自己的逻辑添加 URL,您可以使用事件监听器或事件订阅者。

示例 AppBundle/EventListener/SomeListener.php

<?php

namespace AppBundle\EventListener;

use JantaoDev\SitemapBundle\Service\SitemapListenerInterface;
use JantaoDev\SitemapBundle\Event\SitemapGenerateEvent;
use JantaoDev\SitemapBundle\Sitemap\Url;

class SomeListener implements SitemapListenerInterface
{

    public function generateSitemap(SitemapGenerateEvent $event)
    {
        $sitemap = $event->getSitemap();

        $url = new Url('/index.php', new \DateTime('now'), 0.8, 'weekly');
        $sitemap->add($url);
    }
    
}

示例 AppBundle/Resources/config/services.yml

services:
    app.some_listener:
        class: AppBundle\EventListener\SomeListener
        tags:
            - { name: jantao_dev.sitemap.listener }

6. 备注

TODO

  • 用测试覆盖 EventListener 类
  • 在命令中添加报告

7. 许可证

此扩展包受 MIT 许可证保护