otakoyi / sitemap
Asgardcms CMS Sitemap
dev-master
2018-09-28 14:49 UTC
This package is not auto-updated.
Last update: 2024-09-23 06:50:03 UTC
README
此包可以生成网站地图,无需您手动添加URL。
通常,网站地图不知道已安装的模块和数据库结构。每个模块都应该监听事件并将其数据放入网站地图集合中。
- 可以通过cron作业或通过artisan命令
php artisan sitemap:generate手动运行网站地图。 - 它发送XmlSitemapBuilding事件。此事件具有SitemapCollection实例。
- 每个模块都应该订阅此事件并添加其数据。
以下是一个示例
运行网站地图
\Modules\Sitemap\Console\SitemapGenerateCommand::handle
public function handle()
{
$sitemaps = new SitemapCollection(); // Create collection
event(new XmlSitemapBuilding($sitemaps)); // assign it into event
// after modules added its data to collection, generate sitemap.xml
$this->generate($sitemaps);
}
如何使模块订阅此事件
打开您的服务提供商,并在boot()方法中订阅事件 `\Modules\Sitemap\Events\XmlSitemapBuilding::class`。
if (class_exists(\Modules\Sitemap\Events\XmlSitemapBuilding::class)) {
$this->app['events']->listen(
\Modules\Sitemap\Events\XmlSitemapBuilding::class,
\Modules\Catalog\Events\Handlers\RegisterSitemap::class
);
}
为此事件创建处理程序 `\Modules\Catalog\Events\Handlers\RegisterSitemap::class`。
并将您的实体添加到集合中
<?php
namespace Modules\Catalog\Events\Handlers;
use Modules\Catalog\Entities\CategoriesSitemap;
use Modules\Catalog\Entities\ProductsSitemap;
use Modules\Sitemap\Events\XmlSitemapBuilding;
class RegisterSitemap
{
public function handle(XmlSitemapBuilding $collection)
{
$collection->add(new CategoriesSitemap());
$collection->add(new ProductsSitemap());
}
}
CategoriesSitemap应实现 Modules\Sitemap\Contracts\Sitemap 接口
<?php
namespace Modules\Catalog\Entities;
use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
use Modules\Sitemap\Contracts\Sitemap;
use Modules\Sitemap\Entities\XmlTags\Changefreq;
use Modules\Sitemap\Entities\XmlTags\Url;
class CategoriesSitemap implements Sitemap
{
public function getItems()
{
$priority = 0.7;
$res = [];
$items = Categories::where('active', 1)->get(['id','created_at', 'updated_at']);
$prefix = config('catalog.category.url_prefix');
foreach (LaravelLocalization::getSupportedLocales() as $locale => $language) {
foreach ($items as $item) {
$loc = LaravelLocalization::localizeUrl($prefix . $item->slug);
$lastmod = empty($item->updated_at) ? $item->created_at : $item->updated_at;
$res[] = new Url($loc, $lastmod->toIso8601String(), Changefreq::DAILY, $priority);
}
}
return $res;
}
}