jantaodev / sitemap-bundle
Symfony 扩展包,用于生成 sitemap XML
Requires
- php: >=7.2.5
- ext-json: *
- doctrine/doctrine-bundle: ^2.0
- doctrine/orm: ^2.7
- symfony/framework-bundle: ^5.0
- symfony/yaml: *
Requires (Dev)
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>
有三个参数
- priority(从0到1的实数)
- changeFreq(值之一:always, never, hourly, daily, weekly, monthly, yearly)
- lastMod(见 https://php.ac.cn/manual/en/datetime.formats.php)
并非必须指定所有参数。
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 生成
- 通过控制台
bin/console jantao_dev:sitemap:generate
- 通过服务
$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 许可证保护