class XmlSitemapController in XML sitemap 2.x
Same name and namespace in other branches
- 8 src/Controller/XmlSitemapController.php \Drupal\xmlsitemap\Controller\XmlSitemapController
Class for Xml Sitemap Controller.
Returns responses for xmlsitemap.sitemap_xml and xmlsitemap.sitemap_xsl routes.
Hierarchy
- class \Drupal\Core\Controller\ControllerBase implements ContainerInjectionInterface uses LoggerChannelTrait, MessengerTrait, RedirectDestinationTrait, StringTranslationTrait
- class \Drupal\xmlsitemap\Controller\XmlSitemapController
Expanded class hierarchy of XmlSitemapController
1 file declares its use of XmlSitemapController
- xmlsitemap.module in ./
xmlsitemap.module - xmlsitemap XML sitemap
File
- src/
Controller/ XmlSitemapController.php, line 22
Namespace
Drupal\xmlsitemap\ControllerView source
class XmlSitemapController extends ControllerBase {
/**
* The state store.
*
* @var \Drupal\Core\State\StateInterface
*/
protected $state;
/**
* The configuration factory.
*
* @var \Drupal\Core\Config\ConfigFactoryInterface
*/
protected $configFactory;
/**
* Constructs a new XmlSitemapController object.
*
* @param \Drupal\Core\State\StateInterface $state
* The state service.
* @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
* The configuration factory.
*/
public function __construct(StateInterface $state, ConfigFactoryInterface $config_factory) {
$this->state = $state;
$this->configFactory = $config_factory;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static($container
->get('state'), $container
->get('config.factory'));
}
/**
* Provides the sitemap in XML format.
*
* @param \Symfony\Component\HttpFoundation\Request $request
* The request object.
*
* @return \Symfony\Component\HttpFoundation\BinaryFileResponse
* The sitemap in XML format or plain text if xmlsitemap_developer_mode flag
* is set.
*
* @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException
* If the sitemap is not found or the sitemap file is not readable.
*/
public function renderSitemapXml(Request $request) {
$headers = [];
if ($this->state
->get('xmlsitemap_developer_mode')) {
$headers['X-XmlSitemap-Current-Context'] = Json::encode(xmlsitemap_get_current_context());
$headers['X-XmlSitemap'] = 'NOT FOUND';
}
$sitemap = XmlSitemap::loadByContext();
if (!$sitemap) {
$exception = new NotFoundHttpException();
$exception
->setHeaders($headers);
throw $exception;
}
$chunk = xmlsitemap_get_current_chunk($sitemap, $request);
$file = xmlsitemap_sitemap_get_file($sitemap, $chunk);
// Provide debugging information via headers.
if ($this->state
->get('xmlsitemap_developer_mode')) {
$headers['X-XmlSitemap'] = Json::encode($sitemap
->toArray());
$headers['X-XmlSitemap-Cache-File'] = $file;
$headers['X-XmlSitemap-Cache-Hit'] = file_exists($file) ? 'HIT' : 'MISS';
}
return $this
->getSitemapResponse($file, $request, $headers);
}
/**
* Creates a response object that will output the sitemap file.
*
* @param string $file
* File uri.
* @param \Symfony\Component\HttpFoundation\Request $request
* The current request.
* @param array $headers
* An array of response headers
*
* @return \Symfony\Component\HttpFoundation\BinaryFileResponse
* The sitemap response object.
*
* @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException
* If the sitemap is not found or the sitemap file is not readable.
*/
public function getSitemapResponse($file, Request $request, array $headers = []) {
if (!is_file($file) || !is_readable($file)) {
$exception = new NotFoundHttpException();
$exception
->setHeaders($headers);
throw $exception;
}
$headers += [
'Content-Type' => 'text/xml; charset=utf-8',
'X-Robots-Tag' => 'noindex, follow',
];
$lifetime = $this->configFactory
->get('xmlsitemap.settings')
->get('minimum_lifetime');
$response = new BinaryFileResponse($file, 200, $headers);
$response
->setPrivate();
$response->headers
->addCacheControlDirective('must-revalidate');
//if ($lifetime) {
// $response->headers->addCacheControlDirective('max-age', $lifetime);
//}
// Manually set the etag value instead of hashing the contents of the file.
$last_modified = $response
->getFile()
->getMTime();
$response
->setEtag(md5($last_modified));
// Set expiration using the minimum lifetime.
$response
->setExpires(new \DateTime('@' . ($last_modified + $lifetime)));
// Because we do not want this page to be cached, we manually check the
// modified headers.
$response
->isNotModified($request);
return $response;
}
/**
* Provides the sitemap in XSL format.
*
* @return \Symfony\Component\HttpFoundation\Response
* Response object in XSL format.
*/
public function renderSitemapXsl() {
// Read the XSL content from the file.
$module_path = drupal_get_path('module', 'xmlsitemap');
$xsl_content = file_get_contents($module_path . '/xsl/xmlsitemap.xsl');
// Make sure the strings in the XSL content are translated properly.
$replacements = [
'Sitemap file' => $this
->t('Sitemap file'),
'Generated by the <a href="https://www.drupal.org/project/xmlsitemap">Drupal XML sitemap module</a>.' => $this
->t('Generated by the <a href="@link-xmlsitemap">Drupal XML sitemap module</a>.', [
'@link-xmlsitemap' => 'https://www.drupal.org/project/xmlsitemap',
]),
'Number of sitemaps in this index' => $this
->t('Number of sitemaps in this index'),
'Click on the table headers to change sorting.' => $this
->t('Click on the table headers to change sorting.'),
'Sitemap URL' => $this
->t('Sitemap URL'),
'Last modification date' => $this
->t('Last modification date'),
'Number of URLs in this sitemap' => $this
->t('Number of URLs in this sitemap'),
'URL location' => $this
->t('URL location'),
'Change frequency' => $this
->t('Change frequency'),
'Priority' => $this
->t('Priority'),
'[jquery]' => base_path() . 'core/assets/vendor/jquery/jquery.js',
'[jquery-tablesort]' => base_path() . $module_path . '/xsl/jquery.tablesorter.min.js',
'[xsl-js]' => base_path() . $module_path . '/xsl/xmlsitemap.xsl.js',
'[xsl-css]' => base_path() . $module_path . '/xsl/xmlsitemap.xsl.css',
];
$xsl_content = strtr($xsl_content, $replacements);
// Output the XSL content.
return new Response($xsl_content, 200, [
'Content-Type' => 'application/xml; charset=utf-8',
'X-Robots-Tag' => 'noindex, nofollow',
]);
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
ControllerBase:: |
protected | property | The current user service. | 1 |
ControllerBase:: |
protected | property | The entity form builder. | |
ControllerBase:: |
protected | property | The entity type manager. | |
ControllerBase:: |
protected | property | The form builder. | 2 |
ControllerBase:: |
protected | property | The key-value storage. | 1 |
ControllerBase:: |
protected | property | The language manager. | 1 |
ControllerBase:: |
protected | property | The module handler. | 2 |
ControllerBase:: |
protected | property | The state service. | |
ControllerBase:: |
protected | function | Returns the requested cache bin. | |
ControllerBase:: |
protected | function | Retrieves a configuration object. | |
ControllerBase:: |
private | function | Returns the service container. | |
ControllerBase:: |
protected | function | Returns the current user. | 1 |
ControllerBase:: |
protected | function | Retrieves the entity form builder. | |
ControllerBase:: |
protected | function | Retrieves the entity type manager. | |
ControllerBase:: |
protected | function | Returns the form builder service. | 2 |
ControllerBase:: |
protected | function | Returns a key/value storage collection. | 1 |
ControllerBase:: |
protected | function | Returns the language manager service. | 1 |
ControllerBase:: |
protected | function | Returns the module handler. | 2 |
ControllerBase:: |
protected | function | Returns a redirect response object for the specified route. | |
ControllerBase:: |
protected | function | Returns the state storage service. | |
LoggerChannelTrait:: |
protected | property | The logger channel factory service. | |
LoggerChannelTrait:: |
protected | function | Gets the logger for a specific channel. | |
LoggerChannelTrait:: |
public | function | Injects the logger channel factory. | |
MessengerTrait:: |
protected | property | The messenger. | 27 |
MessengerTrait:: |
public | function | Gets the messenger. | 27 |
MessengerTrait:: |
public | function | Sets the messenger. | |
RedirectDestinationTrait:: |
protected | property | The redirect destination service. | 1 |
RedirectDestinationTrait:: |
protected | function | Prepares a 'destination' URL query parameter for use with \Drupal\Core\Url. | |
RedirectDestinationTrait:: |
protected | function | Returns the redirect destination service. | |
RedirectDestinationTrait:: |
public | function | Sets the redirect destination service. | |
StringTranslationTrait:: |
protected | property | The string translation service. | 4 |
StringTranslationTrait:: |
protected | function | Formats a string containing a count of items. | |
StringTranslationTrait:: |
protected | function | Returns the number of plurals supported by a given language. | |
StringTranslationTrait:: |
protected | function | Gets the string translation service. | |
StringTranslationTrait:: |
public | function | Sets the string translation service to use. | 2 |
StringTranslationTrait:: |
protected | function | Translates a string to the current language or to a given language. | |
XmlSitemapController:: |
protected | property |
The configuration factory. Overrides ControllerBase:: |
|
XmlSitemapController:: |
protected | property | The state store. | |
XmlSitemapController:: |
public static | function |
Instantiates a new instance of this class. Overrides ControllerBase:: |
|
XmlSitemapController:: |
public | function | Creates a response object that will output the sitemap file. | |
XmlSitemapController:: |
public | function | Provides the sitemap in XML format. | |
XmlSitemapController:: |
public | function | Provides the sitemap in XSL format. | |
XmlSitemapController:: |
public | function | Constructs a new XmlSitemapController object. |