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 ;
use Nelmio\ApiDocBundle\ApiDocGenerator ;
2018-01-05 13:08:02 +01:00
use Psr\Container\ContainerInterface ;
use Symfony\Component\DependencyInjection\ServiceLocator ;
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 ;
2018-01-05 13:08:02 +01:00
/**
* @ param ContainerInterface $generatorLocator
*/
2019-11-21 08:53:58 +01:00
public function __construct ( $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
if ( ! $generatorLocator instanceof ContainerInterface ) {
if ( ! $generatorLocator instanceof ApiDocGenerator ) {
throw new \InvalidArgumentException ( sprintf ( 'Providing an instance of "%s" to "%s" is not supported.' , get_class ( $generatorLocator ), __METHOD__ ));
}
@ trigger_error ( sprintf ( 'Providing an instance of "%s" to "%s()" is deprecated since version 3.1. Provide it an instance of "%s" instead.' , ApiDocGenerator :: class , __METHOD__ , ContainerInterface :: class ), E_USER_DEPRECATED );
$generatorLocator = new ServiceLocator ([ 'default' => function () use ( $generatorLocator ) : ApiDocGenerator {
return $generatorLocator ;
}]);
}
$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
}
$spec = $this -> generatorLocator -> get ( $area ) -> generate () -> toArray ();
2017-07-05 15:41:53 +02:00
if ( '' !== $request -> getBaseUrl ()) {
$spec [ 'basePath' ] = $request -> getBaseUrl ();
}
2017-06-20 20:49:50 +02:00
return new Response (
2017-07-05 15:41:53 +02:00
$this -> twig -> render ( '@NelmioApiDoc/SwaggerUi/index.html.twig' , [ 'swagger_data' => [ 'spec' => $spec ]]),
2017-06-20 20:49:50 +02:00
Response :: HTTP_OK ,
[ 'Content-Type' => 'text/html' ]
);
2017-01-18 18:02:00 +01:00
}
}