evheniy/sitemap-xml-bundle
SitemapXmlBundle is a Symfony2 bundle that generates sitemap.xml files for your site. Install it via Composer, register it in AppKernel before your main bundle, then extend SiteMapDumpCommand and implement setEntities() to define your domains and page URLs.
This bundle provides sitemap.xml generator for Symfony2
$ composer require evheniy/sitemap-xml-bundle "1.*"
Or add to composer.json
"evheniy/sitemap-xml-bundle": "1.*"
AppKernel:
public function registerBundles()
{
$bundles = array(
...
new Evheniy\SitemapXmlBundle\SitemapXmlBundle(),
new AppBundle\AppBundle(),
...
);
...
...
You should set bundle before main bundle (in our example it's AppBundle) and extend SiteMapDumpCommand ( setEntities() method )
The easy way to create sitemap:
<?php
namespace AppBundle\Command;
use Evheniy\SitemapXmlBundle\Command\SiteMapDumpCommand as Command;
class SiteMapDumpCommand extends Command
{
protected function setEntities()
{
$this->siteMapEntity = $this->serviceManager->createSiteMapEntity();
$this->dumpEntity->setDomain('site.com');
foreach ($pages as $page) {
$this->siteMapEntity
->addLocation(
$this->serviceManager->createLocationEntity()
->setLocation($page['url'])
->setLastmod(new \DateTime($page['date']))
);
}
}
}
If there are more than 50 000 links you should use sitemap index:
<?php
namespace AppBundle\Command;
use Evheniy\SitemapXmlBundle\Command\SiteMapDumpCommand as Command;
class SiteMapDumpCommand extends Command
{
protected function setEntities()
{
$this->siteMapIndexEntity = $this->serviceManager->createSiteMapIndexEntity();
$this->dumpEntity->setDomain('site.com');
$siteMapEntity = $this->serviceManager->createSiteMapEntity();
foreach ($pages as $page) {
$siteMapEntity->addLocation(
$this->serviceManager->createLocationEntity()
->setLocation($page['url'])
->setLastmod(new \DateTime($page['date']))
);
}
$this->siteMapIndexEntity->addSiteMap($siteMapEntity);
}
}
The last step
app/console sitemap:dump
SitemapXmlBundle made by using fluent interface:
$this->siteMapIndexEntity
->addSiteMap(
$this->serviceManager->createSiteMapEntity()
->addLocation(
$this->serviceManager->createLocationEntity()
->setLocation('http://site.com/page1.html')
->setLastmod(new \DateTime())
)
->addLocation(
$this->serviceManager->createLocationEntity()
->setLocation('http://site.com/page2.html')
->setLastmod(new \DateTime())
->addImage(
$this->serviceManager->createImageEntity()
->setLocation('http://site.com/logo.png')
->setTitle('Logo')
)
)
);
More details:
This bundle is under the MIT license.
How can I help you explore Laravel packages today?