diff --git a/Command/DumpCommand.php b/Command/DumpCommand.php index 40fdfd42..6a89cdd8 100644 --- a/Command/DumpCommand.php +++ b/Command/DumpCommand.php @@ -53,12 +53,18 @@ class DumpCommand extends Command */ private $requestContextBaseUrl; - public function __construct(ExposedRoutesExtractorInterface $extractor, SerializerInterface $serializer, $rootDir, $requestContextBaseUrl = null) + /** + * @var bool + */ + private $exposeOptions; + + public function __construct(ExposedRoutesExtractorInterface $extractor, SerializerInterface $serializer, $rootDir, $requestContextBaseUrl = null, $exposeOptions = false) { $this->extractor = $extractor; $this->serializer = $serializer; $this->rootDir = $rootDir; $this->requestContextBaseUrl = $requestContextBaseUrl; + $this->exposeOptions = $exposeOptions; parent::__construct(); } @@ -140,7 +146,7 @@ private function doDump(InputInterface $input, OutputInterface $output) $this->rootDir, $input->getOption('format') ); - + if (!is_dir($dir = dirname($targetPath))) { $output->writeln('[dir+] ' . $dir); if (false === @mkdir($dir, 0777, true)) { @@ -168,7 +174,9 @@ private function doDump(InputInterface $input, OutputInterface $output) $extractor->getPrefix($input->getOption('locale')), $extractor->getHost(), $extractor->getPort(), - $extractor->getScheme() + $extractor->getScheme(), + null, + $this->exposeOptions ), 'json', $params diff --git a/Controller/Controller.php b/Controller/Controller.php index 7e4124be..fcfb5059 100644 --- a/Controller/Controller.php +++ b/Controller/Controller.php @@ -47,6 +47,11 @@ class Controller */ protected $debug; + /** + * @var boolean + */ + private $exposeRouteOptions; + /** * Default constructor. * @@ -54,13 +59,15 @@ class Controller * @param ExposedRoutesExtractorInterface $exposedRoutesExtractor The extractor service. * @param array $cacheControl * @param boolean $debug + * @param boolean $exposeRouteOptions */ - public function __construct($serializer, ExposedRoutesExtractorInterface $exposedRoutesExtractor, array $cacheControl = array(), $debug = false) + public function __construct($serializer, ExposedRoutesExtractorInterface $exposedRoutesExtractor, array $cacheControl = array(), $debug = false, $exposeRouteOptions = false) { $this->serializer = $serializer; $this->exposedRoutesExtractor = $exposedRoutesExtractor; $this->cacheControlConfig = new CacheControlConfig($cacheControl); $this->debug = $debug; + $this->exposeRouteOptions = $exposeRouteOptions; } /** @@ -98,7 +105,8 @@ public function indexAction(Request $request, $_format) $this->exposedRoutesExtractor->getHost(), $this->exposedRoutesExtractor->getPort(), $this->exposedRoutesExtractor->getScheme(), - $request->getLocale() + $request->getLocale(), + $this->exposeRouteOptions ); $content = $this->serializer->serialize($routesResponse, 'json'); diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index 8f0a210b..4a14a0b0 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -63,6 +63,7 @@ public function getConfigTreeBuilder() ->end() ->end() ->end() + ->booleanNode('expose_options')->defaultFalse()->end() ->end(); return $builder; diff --git a/DependencyInjection/FOSJsRoutingExtension.php b/DependencyInjection/FOSJsRoutingExtension.php index 1746f8cc..42fb785d 100644 --- a/DependencyInjection/FOSJsRoutingExtension.php +++ b/DependencyInjection/FOSJsRoutingExtension.php @@ -65,5 +65,6 @@ public function load(array $configs, ContainerBuilder $container) } $container->setParameter('fos_js_routing.cache_control', $config['cache_control']); + $container->setParameter('fos_js_routing.expose_options', $config['expose_options']); } } diff --git a/Resources/config/controllers.xml b/Resources/config/controllers.xml index ecc7e546..f634e856 100644 --- a/Resources/config/controllers.xml +++ b/Resources/config/controllers.xml @@ -11,6 +11,7 @@ %fos_js_routing.cache_control% %kernel.debug% + %fos_js_routing.expose_options% diff --git a/Resources/config/services.xml b/Resources/config/services.xml index ea3ae385..d48d01c1 100644 --- a/Resources/config/services.xml +++ b/Resources/config/services.xml @@ -20,6 +20,7 @@ %kernel.root_dir% %fos_js_routing.request_context_base_url% + %fos_js_routing.expose_options% diff --git a/Response/RoutesResponse.php b/Response/RoutesResponse.php index 538be722..ca2a0872 100644 --- a/Response/RoutesResponse.php +++ b/Response/RoutesResponse.php @@ -22,16 +22,18 @@ class RoutesResponse private $port; private $scheme; private $locale; + private $exposeRouteOptions; - public function __construct($baseUrl, RouteCollection $routes = null, $prefix = null, $host = null, $port = null, $scheme = null, $locale = null) + public function __construct($baseUrl, RouteCollection $routes = null, $prefix = null, $host = null, $port = null, $scheme = null, $locale = null, $exposeRouteOptions = false) { - $this->baseUrl = $baseUrl; - $this->routes = $routes ?: new RouteCollection(); - $this->prefix = $prefix; - $this->host = $host; + $this->baseUrl = $baseUrl; + $this->routes = $routes ?: new RouteCollection(); + $this->prefix = $prefix; + $this->host = $host; $this->port = $port; - $this->scheme = $scheme; - $this->locale = $locale; + $this->scheme = $scheme; + $this->locale = $locale; + $this->exposeRouteOptions = $exposeRouteOptions; } public function getBaseUrl() @@ -61,6 +63,11 @@ public function getRoutes() 'methods' => $route->getMethods(), 'schemes' => $route->getSchemes(), ); + + $options = $route->getOptions(); + if ($this->exposeRouteOptions && !empty($options['exposed_options'])) { + $exposedRoutes[$name]['options'] = $options['exposed_options']; + } } return $exposedRoutes; diff --git a/Tests/Command/DumpCommandTest.php b/Tests/Command/DumpCommandTest.php index 254f3040..85574f84 100644 --- a/Tests/Command/DumpCommandTest.php +++ b/Tests/Command/DumpCommandTest.php @@ -14,6 +14,7 @@ use FOS\JsRoutingBundle\Command\DumpCommand; use PHPUnit\Framework\TestCase; use Symfony\Component\Console\Tester\CommandTester; +use Symfony\Component\DependencyInjection\ContainerInterface; class DumpCommandTest extends TestCase { diff --git a/Tests/Controller/ControllerTest.php b/Tests/Controller/ControllerTest.php index 10181c4e..e3e243e6 100644 --- a/Tests/Controller/ControllerTest.php +++ b/Tests/Controller/ControllerTest.php @@ -68,6 +68,25 @@ public function testIndexActionWithLocalizedRoutes() $this->assertEquals('{"base_url":"","routes":{"literal":{"tokens":[["text","\/homepage"]],"defaults":[],"requirements":[],"hosttokens":[],"methods":[],"schemes":[]},"blog":{"tokens":[["variable","\/","[^\/]++","_locale"],["variable","\/","[^\/]++","slug"],["text","\/blog-post"]],"defaults":{"_locale":"en"},"requirements":[],"hosttokens":[["text","localhost"]],"methods":[],"schemes":[]}},"prefix":"","host":"","port":null,"scheme":""}', $response->getContent()); } + public function testIndexActionWithExposedOptions() + { + $routes = new RouteCollection(); + $routes->add('literal', new Route('/homepage')); + $routes->add('blog', new Route('/blog-post/{slug}', array(), array(), array('exposed_options' => array('whatever' => false, 'angular_controller' => 'test')), 'localhost')); + + $controller = new Controller( + $this->getSerializer(), + $this->getExtractor($routes), + array(), + false, + true + ); + + $response = $controller->indexAction($this->getRequest('/'), 'json'); + + $this->assertEquals('{"base_url":"","routes":{"literal":{"tokens":[["text","\/homepage"]],"defaults":[],"requirements":[],"hosttokens":[]},"blog":{"tokens":[["variable","\/","[^\/]++","slug"],["text","\/blog-post"]],"defaults":[],"requirements":[],"hosttokens":[["text","localhost"]],"options":{"whatever":false,"angular_controller":"test"}}},"prefix":"","host":"","scheme":""}', $response->getContent()); + } + public function testConfigCache() { $routes = new RouteCollection(); diff --git a/Tests/DependencyInjection/FOSJsRoutingExtensionTest.php b/Tests/DependencyInjection/FOSJsRoutingExtensionTest.php index 294ff341..dce63e2a 100644 --- a/Tests/DependencyInjection/FOSJsRoutingExtensionTest.php +++ b/Tests/DependencyInjection/FOSJsRoutingExtensionTest.php @@ -54,6 +54,39 @@ public function testLoadSetupsSerializerIfNotGiven() $this->assertEquals('{"foo":"bar"}', $serializer->serialize(array('foo' => 'bar'), 'json')); } + public function testExposeOptionsNotSet() + { + $container = $this->load(array()); + + $this->assertTrue($container->hasParameter('fos_js_routing.expose_options')); + $parameter = $container->getParameter('fos_js_routing.expose_options'); + + $this->assertFalse($parameter); + } + + public function provideExposeOptions() + { + return array( + array(true, true), + array(false, false), + ); + } + + /** + * @param bool $configValue + * @param bool $expectedParameter + * @dataProvider provideExposeOptions + */ + public function testExposeOptionsSet($configValue, $expectedParameter) + { + $container = $this->load(array(array('expose_options' => $configValue))); + + $this->assertTrue($container->hasParameter('fos_js_routing.expose_options')); + $parameter = $container->getParameter('fos_js_routing.expose_options'); + + $this->assertEquals($expectedParameter, $parameter); + } + private function load(array $configs) { $container = new ContainerBuilder();