jeroendesloovere/sitemap-bundle

Symfony 插件,用于生成(一个或多个)网站地图和网站地图索引。

2.0.3 2023-08-21 13:25 UTC

README

Latest Stable Version License Build Status Scrutinizer Code Quality

此 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许可证。简而言之,这个许可证允许你做任何事情,只要保留版权声明即可。