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();