Skip to content

Commit 6faeb47

Browse files
authored
Merge pull request #859 from LeaklessGfy/feature/advanced-naming-strategy-nobc
Add AdvancedNamingStrategyInterface
2 parents 55772ac + f3f5c8d commit 6faeb47

11 files changed

Lines changed: 154 additions & 11 deletions

src/JMS/Serializer/AbstractVisitor.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020

2121
use JMS\Serializer\Accessor\AccessorStrategyInterface;
2222
use JMS\Serializer\Accessor\DefaultAccessorStrategy;
23-
use JMS\Serializer\Naming\PropertyNamingStrategyInterface;
2423

2524
abstract class AbstractVisitor implements VisitorInterface
2625
{
@@ -31,7 +30,7 @@ abstract class AbstractVisitor implements VisitorInterface
3130
*/
3231
protected $accessor;
3332

34-
public function __construct(PropertyNamingStrategyInterface $namingStrategy, AccessorStrategyInterface $accessorStrategy = null)
33+
public function __construct($namingStrategy, AccessorStrategyInterface $accessorStrategy = null)
3534
{
3635
$this->namingStrategy = $namingStrategy;
3736
$this->accessor = $accessorStrategy ?: new DefaultAccessorStrategy();

src/JMS/Serializer/GenericDeserializationVisitor.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
use JMS\Serializer\Exception\RuntimeException;
2222
use JMS\Serializer\Metadata\ClassMetadata;
2323
use JMS\Serializer\Metadata\PropertyMetadata;
24+
use JMS\Serializer\Naming\AdvancedNamingStrategyInterface;
25+
use JMS\Serializer\Naming\PropertyNamingStrategyInterface;
2426

2527
/**
2628
* Generic Deserialization Visitor.
@@ -160,7 +162,11 @@ public function startVisitingObject(ClassMetadata $metadata, $object, array $typ
160162

161163
public function visitProperty(PropertyMetadata $metadata, $data, Context $context)
162164
{
163-
$name = $this->namingStrategy->translateName($metadata);
165+
if ($this->namingStrategy instanceof AdvancedNamingStrategyInterface) {
166+
$name = $this->namingStrategy->getPropertyName($metadata, $context);
167+
} else {
168+
$name = $this->namingStrategy->translateName($metadata);
169+
}
164170

165171
if (null === $data) {
166172
return;

src/JMS/Serializer/GenericSerializationVisitor.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
use JMS\Serializer\Exception\InvalidArgumentException;
2222
use JMS\Serializer\Metadata\ClassMetadata;
2323
use JMS\Serializer\Metadata\PropertyMetadata;
24+
use JMS\Serializer\Naming\AdvancedNamingStrategyInterface;
2425

2526
/**
2627
* @deprecated
@@ -157,7 +158,11 @@ public function visitProperty(PropertyMetadata $metadata, $data, Context $contex
157158
return;
158159
}
159160

160-
$k = $this->namingStrategy->translateName($metadata);
161+
if ($this->namingStrategy instanceof AdvancedNamingStrategyInterface) {
162+
$k = $this->namingStrategy->getPropertyName($metadata, $context);
163+
} else {
164+
$k = $this->namingStrategy->translateName($metadata);
165+
}
161166

162167
if ($metadata->inline) {
163168
if (is_array($v)) {

src/JMS/Serializer/JsonSerializationVisitor.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
use JMS\Serializer\Exception\InvalidArgumentException;
2222
use JMS\Serializer\Metadata\ClassMetadata;
2323
use JMS\Serializer\Metadata\PropertyMetadata;
24+
use JMS\Serializer\Naming\AdvancedNamingStrategyInterface;
2425

2526
class JsonSerializationVisitor extends GenericSerializationVisitor
2627
{
@@ -164,7 +165,11 @@ public function visitProperty(PropertyMetadata $metadata, $data, Context $contex
164165
return;
165166
}
166167

167-
$k = $this->namingStrategy->translateName($metadata);
168+
if ($this->namingStrategy instanceof AdvancedNamingStrategyInterface) {
169+
$k = $this->namingStrategy->getPropertyName($metadata, $context);
170+
} else {
171+
$k = $this->namingStrategy->translateName($metadata);
172+
}
168173

169174
if ($metadata->inline) {
170175
if (is_array($v) || ($v instanceof \ArrayObject)) {
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
/*
4+
* Copyright 2016 Johannes M. Schmitt <schmittjoh@gmail.com>
5+
*
6+
* Licensed under the Apache License, Version 2.0 (the "License");
7+
* you may not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS,
14+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*/
18+
19+
namespace JMS\Serializer\Naming;
20+
21+
use JMS\Serializer\Context;
22+
use JMS\Serializer\Metadata\PropertyMetadata;
23+
24+
/**
25+
* Interface for advanced property naming strategies.
26+
*
27+
* Implementations translate the property name to a serialized name that is
28+
* displayed. It allows advanced strategy thanks to context parameter.
29+
*
30+
* @author Vincent Rasquier <vincent.rsbs@gmail.com>
31+
*/
32+
interface AdvancedNamingStrategyInterface
33+
{
34+
/**
35+
* Translates the name of the property to the serialized version.
36+
*
37+
* @param PropertyMetadata $property
38+
* @param Context $context
39+
*
40+
* @return string
41+
*/
42+
public function getPropertyName(PropertyMetadata $property, Context $context);
43+
}

src/JMS/Serializer/SerializerBuilder.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
use JMS\Serializer\Handler\PhpCollectionHandler;
4545
use JMS\Serializer\Handler\PropelCollectionHandler;
4646
use JMS\Serializer\Handler\StdClassHandler;
47+
use JMS\Serializer\Naming\AdvancedNamingStrategyInterface;
4748
use JMS\Serializer\Naming\CamelCaseNamingStrategy;
4849
use JMS\Serializer\Naming\PropertyNamingStrategyInterface;
4950
use JMS\Serializer\Naming\SerializedNameAnnotationStrategy;
@@ -205,6 +206,13 @@ public function setPropertyNamingStrategy(PropertyNamingStrategyInterface $prope
205206
return $this;
206207
}
207208

209+
public function setAdvancedNamingStrategy(AdvancedNamingStrategyInterface $advancedNamingStrategy)
210+
{
211+
$this->propertyNamingStrategy = $advancedNamingStrategy;
212+
213+
return $this;
214+
}
215+
208216
public function setSerializationVisitor($format, VisitorInterface $visitor)
209217
{
210218
$this->visitorsAdded = true;

src/JMS/Serializer/XmlDeserializationVisitor.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
use JMS\Serializer\Exception\XmlErrorException;
2525
use JMS\Serializer\Metadata\ClassMetadata;
2626
use JMS\Serializer\Metadata\PropertyMetadata;
27+
use JMS\Serializer\Naming\AdvancedNamingStrategyInterface;
2728

2829
class XmlDeserializationVisitor extends AbstractVisitor implements NullAwareVisitorInterface
2930
{
@@ -256,7 +257,11 @@ public function startVisitingObject(ClassMetadata $metadata, $object, array $typ
256257

257258
public function visitProperty(PropertyMetadata $metadata, $data, Context $context)
258259
{
259-
$name = $this->namingStrategy->translateName($metadata);
260+
if ($this->namingStrategy instanceof AdvancedNamingStrategyInterface) {
261+
$name = $this->namingStrategy->getPropertyName($metadata, $context);
262+
} else {
263+
$name = $this->namingStrategy->translateName($metadata);
264+
}
260265

261266
if (!$metadata->type) {
262267
throw new RuntimeException(sprintf('You must define a type for %s::$%s.', $metadata->reflection->class, $metadata->name));

src/JMS/Serializer/XmlSerializationVisitor.php

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
use JMS\Serializer\Exception\RuntimeException;
2323
use JMS\Serializer\Metadata\ClassMetadata;
2424
use JMS\Serializer\Metadata\PropertyMetadata;
25+
use JMS\Serializer\Naming\AdvancedNamingStrategyInterface;
2526
use JMS\Serializer\Naming\PropertyNamingStrategyInterface;
2627

2728
/**
@@ -49,7 +50,7 @@ class XmlSerializationVisitor extends AbstractVisitor
4950
/** @var boolean */
5051
private $formatOutput;
5152

52-
public function __construct(PropertyNamingStrategyInterface $namingStrategy, AccessorStrategyInterface $accessorStrategy = null)
53+
public function __construct($namingStrategy, AccessorStrategyInterface $accessorStrategy = null)
5354
{
5455
parent::__construct($namingStrategy, $accessorStrategy);
5556
$this->objectMetadataStack = new \SplStack;
@@ -244,7 +245,11 @@ public function visitProperty(PropertyMetadata $metadata, $object, Context $cont
244245
if (!$node instanceof \DOMCharacterData) {
245246
throw new RuntimeException(sprintf('Unsupported value for XML attribute for %s. Expected character data, but got %s.', $metadata->name, json_encode($v)));
246247
}
247-
$attributeName = $this->namingStrategy->translateName($metadata);
248+
if ($this->namingStrategy instanceof AdvancedNamingStrategyInterface) {
249+
$attributeName = $this->namingStrategy->getPropertyName($metadata, $context);
250+
} else {
251+
$attributeName = $this->namingStrategy->translateName($metadata);
252+
}
248253
$this->setAttributeOnNode($this->currentNode, $attributeName, $node->nodeValue, $metadata->xmlNamespace);
249254

250255
return;
@@ -293,7 +298,11 @@ public function visitProperty(PropertyMetadata $metadata, $object, Context $cont
293298
}
294299

295300
if ($addEnclosingElement = !$this->isInLineCollection($metadata) && !$metadata->inline) {
296-
$elementName = $this->namingStrategy->translateName($metadata);
301+
if ($this->namingStrategy instanceof AdvancedNamingStrategyInterface) {
302+
$elementName = $this->namingStrategy->getPropertyName($metadata, $context);
303+
} else {
304+
$elementName = $this->namingStrategy->translateName($metadata);
305+
}
297306

298307
$namespace = null !== $metadata->xmlNamespace
299308
? $metadata->xmlNamespace

src/JMS/Serializer/YamlSerializationVisitor.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
use JMS\Serializer\Accessor\AccessorStrategyInterface;
2222
use JMS\Serializer\Metadata\ClassMetadata;
2323
use JMS\Serializer\Metadata\PropertyMetadata;
24+
use JMS\Serializer\Naming\AdvancedNamingStrategyInterface;
2425
use JMS\Serializer\Naming\PropertyNamingStrategyInterface;
2526
use JMS\Serializer\Util\Writer;
2627
use Symfony\Component\Yaml\Inline;
@@ -40,7 +41,7 @@ class YamlSerializationVisitor extends AbstractVisitor
4041
private $metadataStack;
4142
private $currentMetadata;
4243

43-
public function __construct(PropertyNamingStrategyInterface $namingStrategy, AccessorStrategyInterface $accessorStrategy = null)
44+
public function __construct($namingStrategy, AccessorStrategyInterface $accessorStrategy = null)
4445
{
4546
parent::__construct($namingStrategy, $accessorStrategy);
4647

@@ -165,7 +166,11 @@ public function visitProperty(PropertyMetadata $metadata, $data, Context $contex
165166
return;
166167
}
167168

168-
$name = $this->namingStrategy->translateName($metadata);
169+
if ($this->namingStrategy instanceof AdvancedNamingStrategyInterface) {
170+
$name = $this->namingStrategy->getPropertyName($metadata, $context);
171+
} else {
172+
$name = $this->namingStrategy->translateName($metadata);
173+
}
169174

170175
if (!$metadata->inline) {
171176
$this->writer
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?php
2+
3+
/*
4+
* Copyright 2016 Johannes M. Schmitt <schmittjoh@gmail.com>
5+
*
6+
* Licensed under the Apache License, Version 2.0 (the "License");
7+
* you may not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS,
14+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*/
18+
19+
namespace JMS\Serializer\Tests\Fixtures;
20+
21+
use JMS\Serializer\Context;
22+
use JMS\Serializer\GraphNavigator;
23+
use JMS\Serializer\Metadata\PropertyMetadata;
24+
use JMS\Serializer\Naming\AdvancedNamingStrategyInterface;
25+
26+
/**
27+
* Class ContextualNamingStrategy
28+
*
29+
* Only use this class for testing purpose
30+
*/
31+
class ContextualNamingStrategy implements AdvancedNamingStrategyInterface
32+
{
33+
public function getPropertyName(PropertyMetadata $property, Context $context)
34+
{
35+
if ($context->getDirection() == GraphNavigator::DIRECTION_SERIALIZATION) {
36+
return strtoupper($property->name);
37+
}
38+
return ucfirst($property->name);
39+
}
40+
}

0 commit comments

Comments
 (0)