Skip to content

Commit 5396e52

Browse files
authored
Implement simple way to alter base uri resolving. (#30)
1 parent 51995f6 commit 5396e52

File tree

7 files changed

+84
-7
lines changed

7 files changed

+84
-7
lines changed

DependencyInjection/Configuration.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ public function getConfigTreeBuilder()
2323

2424
$rootNode
2525
->children()
26-
->booleanNode('show_version_info')->defaultValue(true)->end()
26+
->booleanNode('show_version_info')->defaultValue(true)->end()
27+
->scalarNode('base_uri')->defaultValue('/api')->end()
2728
->end()
2829
;
2930

DependencyInjection/MangoJsonApiExtension.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,5 +53,6 @@ public function load(array $configs, ContainerBuilder $container)
5353
}
5454

5555
$container->setParameter('json_api.show_version_info', $config['show_version_info']);
56+
$container->setParameter('json_api.base_uri', $config['base_uri']);
5657
}
5758
}

EventListener/Serializer/JsonEventSubscriber.php

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@
1717
use JMS\Serializer\EventDispatcher\EventSubscriberInterface;
1818
use JMS\Serializer\EventDispatcher\ObjectEvent;
1919
use JMS\Serializer\Naming\PropertyNamingStrategyInterface;
20-
use JMS\Serializer\VisitorInterface;
2120
use Mango\Bundle\JsonApiBundle\Configuration\Metadata\ClassMetadata;
2221
use Mango\Bundle\JsonApiBundle\Configuration\Relationship;
22+
use Mango\Bundle\JsonApiBundle\Resolver\BaseUri\BaseUriResolverInterface;
2323
use Mango\Bundle\JsonApiBundle\Serializer\JsonApiSerializationVisitor;
2424
use Metadata\MetadataFactoryInterface;
2525
use Symfony\Component\HttpFoundation\RequestStack;
@@ -64,7 +64,10 @@ class JsonEventSubscriber implements EventSubscriberInterface
6464
*/
6565
protected $currentPath;
6666

67-
protected $baseUrl = '/api';
67+
/**
68+
* @var BaseUriResolverInterface
69+
*/
70+
protected $baseUriResolver;
6871

6972
/**
7073
* @param MetadataFactoryInterface $jsonApiMetadataFactory
@@ -76,12 +79,14 @@ public function __construct(
7679
MetadataFactoryInterface $jsonApiMetadataFactory,
7780
MetadataFactoryInterface $jmsMetadataFactory,
7881
PropertyNamingStrategyInterface $namingStrategy,
79-
RequestStack $requestStack
82+
RequestStack $requestStack,
83+
BaseUriResolverInterface $baseUriResolver
8084
) {
8185
$this->jsonApiMetadataFactory = $jsonApiMetadataFactory;
8286
$this->jmsMetadataFactory = $jmsMetadataFactory;
8387
$this->namingStrategy = $namingStrategy;
8488
$this->requestStack = $requestStack;
89+
$this->baseUriResolver = $baseUriResolver;
8590
}
8691

8792
/**
@@ -190,7 +195,7 @@ public function onPostSerialize(ObjectEvent $event)
190195
// TODO: Improve link handling
191196
if (true === $metadata->getResource()->getShowLinkSelf()) {
192197
$visitor->addData('links', array(
193-
'self' => $this->baseUrl.'/'.$metadata->getResource()
198+
'self' => $this->baseUriResolver->getBaseUri().'/'.$metadata->getResource()
194199
->getType($object).'/'.$this->getId($metadata, $object),
195200
));
196201
}
@@ -216,12 +221,12 @@ protected function processRelationshipLinks($primaryObject, Relationship $relati
216221

217222
// TODO: Improve this
218223
if ($relationship->getShowLinkSelf()) {
219-
$links['self'] = $this->baseUrl.'/'.$primaryMetadata->getResource()
224+
$links['self'] = $this->baseUriResolver->getBaseUri().'/'.$primaryMetadata->getResource()
220225
->getType($primaryObject).'/'.$primaryId.'/relationships/'.$relationshipPayloadKey;
221226
}
222227

223228
if ($relationship->getShowLinkRelated()) {
224-
$links['related'] = $this->baseUrl.'/'.$primaryMetadata->getResource()->getType($primaryObject).'/'.$primaryId.'/'.$relationshipPayloadKey;
229+
$links['related'] = $this->baseUriResolver->getBaseUri().'/'.$primaryMetadata->getResource()->getType($primaryObject).'/'.$primaryId.'/'.$relationshipPayloadKey;
225230
}
226231

227232
return $links;

README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,13 @@ Integration of JSON API with Symfony 2 (FOSRestBundle)
1111
1212
If you want to experiment with this implementation, you can just enable this bundle in your `AppKernel` and everything should work directly. Try to serialize some annotated php classes and check it out!
1313

14+
### Configuration reference
15+
```yml
16+
mango_json_api:
17+
show_version_info: true # default
18+
base_uri: /api # default
19+
```
20+
1421
## Annotations
1522
### @Resource
1623
This will define your class as a JSON-API resource, and you can optionally set it's type name.
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
3+
/*
4+
* (c) Steffen Brem
5+
*
6+
* For the full copyright and license information, please view the LICENSE
7+
* file that was distributed with this source code.
8+
*/
9+
10+
namespace Mango\Bundle\JsonApiBundle\Resolver\BaseUri;
11+
12+
/**
13+
* @author Steffen Brem <steffenbrem@gmail.com>
14+
*/
15+
class BaseUriResolver implements BaseUriResolverInterface
16+
{
17+
/**
18+
* @var string
19+
*/
20+
private $baseUri;
21+
22+
/**
23+
* @param string $baseUri
24+
*/
25+
public function __construct($baseUri)
26+
{
27+
$this->baseUri = $baseUri;
28+
}
29+
30+
/**
31+
* @inheritDoc
32+
*/
33+
public function getBaseUri()
34+
{
35+
return $this->baseUri;
36+
}
37+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
/*
4+
* (c) Steffen Brem
5+
*
6+
* For the full copyright and license information, please view the LICENSE
7+
* file that was distributed with this source code.
8+
*/
9+
10+
namespace Mango\Bundle\JsonApiBundle\Resolver\BaseUri;
11+
12+
/**
13+
* @author Steffen Brem <steffenbrem@gmail.com>
14+
*/
15+
interface BaseUriResolverInterface
16+
{
17+
/**
18+
* @return string
19+
*/
20+
public function getBaseUri();
21+
}

Resources/config/services.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
<argument type="service" id="jms_serializer.metadata_factory"/>
1616
<argument type="service" id="jms_serializer.naming_strategy"/>
1717
<argument type="service" id="request_stack"/>
18+
<argument type="service" id="json_api.resolver.base_uri"/>
1819
<tag name="jms_serializer.event_subscriber"/>
1920
</service>
2021

@@ -37,6 +38,10 @@
3738
<tag name="jms_serializer.subscribing_handler"/>
3839
</service>
3940

41+
<service id="json_api.resolver.base_uri" alias="json_api.resolver.base_uri.default"/>
42+
<service id="json_api.resolver.base_uri.default" class="Mango\Bundle\JsonApiBundle\Resolver\BaseUri\BaseUriResolver">
43+
<argument>%json_api.base_uri%</argument>
44+
</service>
4045
</services>
4146

4247
</container>

0 commit comments

Comments
 (0)