2017-01-18 18:02:00 +01:00
< ? php
/*
* This file is part of the NelmioApiDocBundle package .
*
* ( c ) Nelmio
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
namespace Nelmio\ApiDocBundle\Controller ;
2020-05-28 13:19:11 +02:00
use OpenApi\Annotations\OpenApi ;
use OpenApi\Annotations\Server ;
2018-01-05 13:08:02 +01:00
use Psr\Container\ContainerInterface ;
2017-07-05 15:41:53 +02:00
use Symfony\Component\HttpFoundation\Request ;
2017-01-18 18:02:00 +01:00
use Symfony\Component\HttpFoundation\Response ;
2018-01-05 13:08:02 +01:00
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException ;
2019-11-21 08:53:58 +01:00
use Twig\Environment ;
2017-01-18 18:02:00 +01:00
final class SwaggerUiController
{
2018-01-05 13:08:02 +01:00
private $generatorLocator ;
2017-12-22 17:42:18 +00:00
2017-01-18 18:02:00 +01:00
private $twig ;
2020-05-31 18:18:29 +02:00
public function __construct ( ContainerInterface $generatorLocator , $twig )
2017-01-18 18:02:00 +01:00
{
2019-11-21 08:53:58 +01:00
if ( ! $twig instanceof \Twig_Environment && ! $twig instanceof Environment ) {
throw new \InvalidArgumentException ( sprintf ( 'Providing an instance of "%s" as twig is not supported.' , get_class ( $twig )));
}
2018-01-05 13:08:02 +01:00
$this -> generatorLocator = $generatorLocator ;
2017-01-18 18:02:00 +01:00
$this -> twig = $twig ;
}
2018-01-05 13:08:02 +01:00
public function __invoke ( Request $request , $area = 'default' )
2017-01-18 18:02:00 +01:00
{
2018-01-05 13:08:02 +01:00
if ( ! $this -> generatorLocator -> has ( $area )) {
2019-04-12 09:35:49 +02:00
$advice = '' ;
if ( false !== strpos ( $area , '.json' )) {
$advice = ' Since the area provided contains `.json`, the issue is likely caused by route priorities. Try switching the Swagger UI / the json documentation routes order.' ;
}
throw new BadRequestHttpException ( sprintf ( 'Area "%s" is not supported as it isn\'t defined in config.%s' , $area , $advice ));
2018-01-05 13:08:02 +01:00
}
2020-05-28 13:19:11 +02:00
/** @var OpenApi $spec */
$spec = $this -> generatorLocator -> get ( $area ) -> generate ();
2017-07-05 15:41:53 +02:00
if ( '' !== $request -> getBaseUrl ()) {
2020-05-28 13:19:11 +02:00
$spec -> servers = [ new Server ([ 'url' => $request -> getSchemeAndHttpHost () . $request -> getBaseUrl ()])];
2017-07-05 15:41:53 +02:00
}
2017-06-20 20:49:50 +02:00
return new Response (
2020-05-28 13:19:11 +02:00
$this -> twig -> render (
'@NelmioApiDoc/SwaggerUi/index.html.twig' ,
[ 'swagger_data' => [ 'spec' => json_decode ( $spec -> toJson (), true )]]
),
2017-06-20 20:49:50 +02:00
Response :: HTTP_OK ,
[ 'Content-Type' => 'text/html' ]
);
2020-10-02 13:52:30 -03:00
return $response -> setCharset ( 'UTF-8' );
2017-01-18 18:02:00 +01:00
}
}