jeroendesloovere / sitemap-bundle
Symfony 插件,用于生成(一个或多个)网站地图和网站地图索引。
Requires
- php: ^7.4||^8.0
- symfony/console: 3.*|^4.0
- symfony/framework-bundle: 3.*|^4.0
Requires (Dev)
- mikey179/vfsstream: ^1.6
- phpunit/phpunit: ^9.6
- squizlabs/php_codesniffer: ^3.5
This package is auto-updated.
Last update: 2024-09-21 16:23:48 UTC
README
此 Symfony 插件允许您轻松生成网站地图索引和一个或多个网站地图。
待办功能
需要完成什么
- 生成“网站地图提供者最后修改时间”信息,这些信息需要在网站地图索引中显示。
使用方法
安装
composer require jeroendesloovere/sitemap-bundle
示例:“如何创建您的自定义网站地图?”
我们需要通知 Symfony 我们有一个新的网站地图提供者。在您的 services.yaml
文件中的某个位置添加以下内容:
services: App\SitemapProviders\NewsArticleSitemapProvider: tags: - { name: sitemap.provider }
当 SitemapGenerator
需要生成网站地图时,它将询问所有网站地图提供者填充条目。在您的应用程序中创建如下内容:
<?php namespace App\SitemapProviders; use JeroenDesloovere\SitemapBundle\Item\ChangeFrequency; use JeroenDesloovere\SitemapBundle\Provider\SitemapProvider; use JeroenDesloovere\SitemapBundle\Provider\SitemapProviderInterface; class NewsArticleSitemapProvider extends SitemapProvider implements SitemapProviderInterface { /** @var NewsArticleRepository */ private $articleRepository; public function __construct(NewsArticleRepository $articleRepository) { $this->articleRepository = $articleRepository; // `NewsArticle::class` would even be better then just `NewsArticle` // because you can then use it with doctrine events. parent::__construct('NewsArticle'); } public function createItems(): void { /** @var Article[] $articles */ $articles = $this->articleRepository->findAll(); foreach ($articles as $article) { $this->createItem('/nl/xxx/url-to-article', $article->getEditedOn(), ChangeFrequency::monthly()); } } }
您现在可以通过执行以下命令生成网站地图:
bin/console sitemap:generate
使用 cron 作业(例如每小时一次)来保持网站地图的最新状态。
或者,如果您想使用 PHP
$this->getContainer()->get('sitemap.generator')->generate();
示例:您可以用以下方式覆盖上下文
问题
在 symfony 中存在一个已知的“bug”,即控制台中的上下文总是 http://localhost
,例如:当执行 bin/console sitemap:generate
时。[在 Symfony 网站上了解更多信息](https://symfony.ac.cn/doc/current/console/request_context.html)。
解决方案
两个提供的解决方案之一是您可以通过添加代码中的 CompilerPass 来解决空的上下文问题。
<?php namespace App\Sitemap; use App\Sitemap\DependencyInjection\Compiler\SitemapProviderPass; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\HttpKernel\Bundle\Bundle; class SitemapBundle extends Bundle { public function build(ContainerBuilder $container) { $container->addCompilerPass(new SitemapProviderPass()); } }
<?php namespace App\Sitemap\DependencyInjection\Compiler; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; class SitemapCompilerPass implements CompilerPassInterface { public function process(ContainerBuilder $container): void { if (!$container->has('sitemap.generator')) { return; } $container->setParameter('router.request_context.host', 'www.mywebsite.com'); $container->setParameter('router.request_context.scheme', 'http'); $container->setParameter('router.request_context.base_url', ''); $container->setParameter('asset.request_context.base_path', $container->getParameter('router.request_context.base_url')); $container->setParameter('asset.request_context.secure', true); } }
示例:“如何使用 Doctrine 订阅者?”
有时您希望从 Doctrine 事件中获取数据库更改。以下代码可以帮助您完成此操作并重新生成网站地图。
sitemap.subscriber: class: JeroenDesloovere\SitemapBundle\EventListener\SitemapSubscriber tags: - { name: doctrine.event_subscriber } arguments: - "@sitemap.providers" - "@sitemap.generator"
<?php namespace JeroenDesloovere\SitemapBundle\EventListener; use Doctrine\Common\EventSubscriber; use Doctrine\Common\Persistence\Event\LifecycleEventArgs; use Doctrine\ORM\Events; use JeroenDesloovere\SitemapBundle\Generator\SitemapGenerator; use JeroenDesloovere\SitemapBundle\Provider\SitemapProviders; class SitemapSubscriber implements EventSubscriber { /** @var SitemapGenerator */ private $sitemapGenerator; /** @var SitemapProviders */ private $sitemapProviders; public function __construct(SitemapProviders $sitemapProviders, SitemapGenerator $sitemapGenerator) { $this->sitemapProviders = $sitemapProviders; $this->sitemapGenerator = $sitemapGenerator; } public function getSubscribedEvents(): array { return [ Events::postPersist, Events::postUpdate, Events::postRemove, ]; } /** * @param LifecycleEventArgs $eventArgs * @throws \Exception */ public function regenerate(LifecycleEventArgs $eventArgs): void { $entityClass = get_class($eventArgs->getObject()); if ($this->sitemapProviders->exists($entityClass)) { $this->sitemapGenerator->regenerateForSitemapProvider($this->sitemapProviders->get($entityClass)); } } public function postPersist(LifecycleEventArgs $eventArgs): void { $this->regenerate($eventArgs); } public function postRemove(LifecycleEventArgs $eventArgs): void { $this->regenerate($eventArgs); } public function postUpdate(LifecycleEventArgs $eventArgs): void { $this->regenerate($eventArgs); } }
文档
类有很好的内联文档。如果您使用了一个不错的 IDE,您会看到每个方法都有 PHPDoc 进行了文档记录。
贡献
贡献是 欢迎的,并将得到完全 认可。
拉取请求
添加或更新代码
- 编码语法 - 请确保代码语法与包的其他部分保持一致。
- 添加单元测试! - 如果您的补丁没有测试,则不会被接受。
- 记录任何行为变化 - 确保 README 和任何其他相关文档都保持最新。
- 考虑我们的发布周期 - 我们尽量遵循 semver。随机破坏公共 API 不是一种选择。
- 创建主题分支 - 请不要要求我们从您的 master 分支中拉取。
- 每个功能一个拉取请求 - 如果您想做更多的事情,请发送多个拉取请求。
- 发送连贯的历史记录 - 确保您的拉取请求中的每个单独提交都很有意义。如果您在开发过程中不得不做出多个中间提交,请在提交之前将它们压缩。
问题
有关错误报告或代码讨论。
有关如何在 help.github.com 上与 GitHub 一起工作的更多信息。
编码语法
我们使用 squizlabs/php_codesniffer 来维护代码标准。输入以下内容以执行它们:
# To view the code errors vendor/bin/phpcs --standard=psr2 --extensions=php --warning-severity=0 --report=full "src" # OR to fix the code errors vendor/bin/phpcbf --standard=psr2 --extensions=php --warning-severity=0 --report=full "src"
单元测试
我们有内置的测试,输入以下内容以执行它们:
vendor/bin/phpunit tests
致谢
许可
该模块遵循MIT许可证。简而言之,这个许可证允许你做任何事情,只要保留版权声明即可。