NelmioApiDocBundle/Extractor/CachingApiDocExtractor.php

93 lines
2.5 KiB
PHP
Raw Normal View History

<?php
/*
* This file is part of the NelmioApiDocBundle.
*
* (c) Nelmio <hello@nelm.io>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Nelmio\ApiDocBundle\Extractor;
2024-10-01 23:00:23 +03:00
use Nelmio\ApiDocBundle\Attribute\ApiDoc;
2024-10-01 15:54:04 +03:00
use Nelmio\ApiDocBundle\Util\DocCommentExtractor;
use Symfony\Component\Config\ConfigCache;
use Symfony\Component\Config\Resource\FileResource;
use Symfony\Component\Routing\RouterInterface;
/**
* Class CachingApiDocExtractor
*
* @author Bez Hermoso <bez@activelamp.com>
*/
class CachingApiDocExtractor extends ApiDocExtractor
{
2015-07-21 17:13:40 +07:00
/**
2024-10-01 16:39:44 +03:00
* @param HandlerInterface[] $handlers
* @param string[] $excludeSections
* @param bool|false $debug
2015-07-21 17:13:40 +07:00
*/
public function __construct(
RouterInterface $router,
DocCommentExtractor $commentExtractor,
array $handlers,
array $excludeSections,
private string $cacheFile,
2024-10-01 15:54:04 +03:00
private bool $debug = false,
) {
2024-10-01 23:00:23 +03:00
parent::__construct($router, $commentExtractor, $handlers, $excludeSections);
}
2015-07-21 17:13:40 +07:00
/**
2024-10-01 15:54:04 +03:00
* @param string $view View name
*
2015-07-21 17:13:40 +07:00
* @return array|mixed
*/
2024-10-01 23:00:23 +03:00
public function all($view = ApiDoc::DEFAULT_VIEW): array
{
2015-07-21 17:13:40 +07:00
$cache = $this->getViewCache($view);
2015-10-23 10:07:45 +02:00
if (!$cache->isFresh()) {
2024-10-01 15:54:04 +03:00
$resources = [];
foreach ($this->getRoutes() as $route) {
2024-10-01 23:00:23 +03:00
if (
null !== ($method = $this->getReflectionMethod($route->getDefault('_controller')))
&& null !== $this->getMethodApiDoc($method)
) {
2024-10-01 15:54:04 +03:00
$file = $method->getDeclaringClass()->getFileName();
$resources[] = new FileResource($file);
}
}
$resources = array_merge($resources, $this->router->getRouteCollection()->getResources());
$data = parent::all($view);
2015-07-21 17:13:40 +07:00
$cache->write(serialize($data), $resources);
2015-03-06 11:19:08 +01:00
return $data;
}
2015-10-23 10:07:45 +02:00
// For BC
if (method_exists($cache, 'getPath')) {
$cachePath = $cache->getPath();
} else {
$cachePath = (string) $cache;
}
2015-07-21 17:13:40 +07:00
2015-10-23 10:07:45 +02:00
return unserialize(file_get_contents($cachePath));
2015-07-21 17:13:40 +07:00
}
2015-07-21 17:13:40 +07:00
/**
2024-10-01 15:54:04 +03:00
* @param string $view
*
2015-07-21 17:13:40 +07:00
* @return ConfigCache
*/
private function getViewCache($view)
2015-07-21 17:13:40 +07:00
{
2024-10-01 15:54:04 +03:00
return new ConfigCache($this->cacheFile . '.' . $view, $this->debug);
}
2015-03-06 11:19:08 +01:00
}