Skip to content

Commit

Permalink
Add serializer.propertyNamingStrategy service
Browse files Browse the repository at this point in the history
Becasue SerializerVistors and DeserializerVisitors typically take the
naming strategy as an argument, it is helpful to have access to the
naming strategy that the provider uses.
  • Loading branch information
jdesrosiers committed Jul 20, 2016
1 parent 8ee6a51 commit a7d2835
Show file tree
Hide file tree
Showing 7 changed files with 148 additions and 130 deletions.
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1 @@
/vendor/
/vendor/
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ Services
* **serializer**: A Serializer object constructed with all of parameters given.
* **serializer.builder**: If all of the shortcuts provided are not sufficient, you can always get the SerializerBuilder
object and add additional customizations before the Serializer object is constructed.
* **serializer.propertyNamingStrategy**: The PropertyNamingStrategy object that is generated by the provider. You
shouldn't need to use it unless you are doing something fancy with the builder.

Registering
-----------
Expand Down
7 changes: 1 addition & 6 deletions phpunit.xml.dist
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,7 @@
>
<testsuites>
<testsuite name="silex-jms-serializer-provider Test Suite">
<directory>./tests/</directory>
<directory>./src/Test</directory>
</testsuite>
</testsuites>
<filter>
<whitelist>
<directory>./src</directory>
</whitelist>
</filter>
</phpunit>
87 changes: 87 additions & 0 deletions src/BuilderService.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
<?php

namespace JDesrosiers\Silex\Provider;

use JMS\Serializer\SerializerBuilder;
use Pimple\Container;

class BuilderService
{
public function __invoke(Container $app) {
$serializerBuilder = SerializerBuilder::create();

if ($app->offsetExists("debug")) {
$serializerBuilder->setDebug($app["debug"]);
}

if ($app->offsetExists("serializer.annotationReader")) {
$serializerBuilder->setAnnotationReader($app["serializer.annotationReader"]);
}

if ($app->offsetExists("serializer.cacheDir")) {
$serializerBuilder->setCacheDir($app["serializer.cacheDir"]);
}

if ($app->offsetExists("serializer.configureHandlers")) {
$serializerBuilder->configureHandlers($app["serializer.configureHandlers"]);
}

if ($app->offsetExists("serializer.configureListeners")) {
$serializerBuilder->configureListeners($app["serializer.configureListeners"]);
}

if ($app->offsetExists("serializer.objectConstructor")) {
$serializerBuilder->setObjectConstructor($app["serializer.objectConstructor"]);
}

$serializerBuilder->setPropertyNamingStrategy($app["serializer.propertyNamingStrategy"]);

if ($app->offsetExists("serializer.serializationVisitors")) {
$this->setSerializationVisitors($app, $serializerBuilder);
}

if ($app->offsetExists("serializer.deserializationVisitors")) {
$this->setDeserializationVisitors($app, $serializerBuilder);
}

if ($app->offsetExists("serializer.includeInterfaceMetadata")) {
$serializerBuilder->includeInterfaceMetadata($app["serializer.includeInterfaceMetadata"]);
}

if ($app->offsetExists("serializer.metadataDirs")) {
$serializerBuilder->setMetadataDirs($app["serializer.metadataDirs"]);
}

return $serializerBuilder;
}

/**
* Override default serialization vistors
*
* @param Container $app
* @param SerializerBuilder $serializerBuilder
*/
protected function setSerializationVisitors(Container $app, SerializerBuilder $serializerBuilder)
{
$serializerBuilder->addDefaultSerializationVisitors();

foreach ($app["serializer.serializationVisitors"] as $format => $visitor) {
$serializerBuilder->setSerializationVisitor($format, $visitor);
}
}

/**
* Override default deserialization visitors
*
* @param Container $app
* @param SerializerBuilder $serializerBuilder
*/
protected function setDeserializationVisitors(Container $app, SerializerBuilder $serializerBuilder)
{
$serializerBuilder->addDefaultDeserializationVisitors();

foreach ($app["serializer.deserializationVisitors"] as $format => $visitor) {
$serializerBuilder->setDeserializationVisitor($format, $visitor);
}
}
}
129 changes: 7 additions & 122 deletions src/JmsSerializerServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,10 @@
namespace JDesrosiers\Silex\Provider;

use Doctrine\Common\Annotations\AnnotationRegistry;
use JMS\Serializer\Naming\CamelCaseNamingStrategy;
use JMS\Serializer\Naming\IdenticalPropertyNamingStrategy;
use JMS\Serializer\Naming\PropertyNamingStrategyInterface;
use JMS\Serializer\Naming\SerializedNameAnnotationStrategy;
use JMS\Serializer\SerializerBuilder;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
use Silex\Application;
use Silex\Api\BootableProviderInterface;
use Silex\Application;
use Symfony\Component\HttpKernel\Exception\ServiceUnavailableHttpException;

/**
Expand Down Expand Up @@ -40,124 +35,14 @@ public function boot(Application $app)
*/
public function register(Container $app)
{
$app["serializer.namingStrategy.separator"] = null;
$app["serializer.namingStrategy.lowerCase"] = null;

$app["serializer.builder"] = function () use ($app) {
$serializerBuilder = SerializerBuilder::create()->setDebug($app["debug"]);

if ($app->offsetExists("serializer.annotationReader")) {
$serializerBuilder->setAnnotationReader($app["serializer.annotationReader"]);
}

if ($app->offsetExists("serializer.cacheDir")) {
$serializerBuilder->setCacheDir($app["serializer.cacheDir"]);
}

if ($app->offsetExists("serializer.configureHandlers")) {
$serializerBuilder->configureHandlers($app["serializer.configureHandlers"]);
}

if ($app->offsetExists("serializer.configureListeners")) {
$serializerBuilder->configureListeners($app["serializer.configureListeners"]);
}

if ($app->offsetExists("serializer.objectConstructor")) {
$serializerBuilder->setObjectConstructor($app["serializer.objectConstructor"]);
}

if ($app->offsetExists("serializer.namingStrategy")) {
$this->namingStrategy($app, $serializerBuilder);
}

if ($app->offsetExists("serializer.serializationVisitors")) {
$this->setSerializationVisitors($app, $serializerBuilder);
}

if ($app->offsetExists("serializer.deserializationVisitors")) {
$this->setDeserializationVisitors($app, $serializerBuilder);
}

if ($app->offsetExists("serializer.includeInterfaceMetadata")) {
$serializerBuilder->includeInterfaceMetadata($app["serializer.includeInterfaceMetadata"]);
}
$app["serializer.namingStrategy"] = "CamelCase";
$app["serializer.namingStrategy.separator"] = "_";
$app["serializer.namingStrategy.lowerCase"] = true;

if ($app->offsetExists("serializer.metadataDirs")) {
$serializerBuilder->setMetadataDirs($app["serializer.metadataDirs"]);
}

return $serializerBuilder;
};

$app["serializer"] = function () use ($app) {
$app["serializer.propertyNamingStrategy"] = new PropertyNamingStrategyService();
$app["serializer.builder"] = new BuilderService();
$app["serializer"] = function (Container $app) {
return $app["serializer.builder"]->build();
};
}

/**
* Set the serialization naming strategy
*
* @param Container $app
* @param SerializerBuilder $serializerBuilder
*
* @throws ServiceUnavailableHttpException
*/
protected function namingStrategy(Container $app, SerializerBuilder $serializerBuilder)
{
if ($app["serializer.namingStrategy"] instanceof PropertyNamingStrategyInterface) {
$namingStrategy = $app["serializer.namingStrategy"];
} else {
switch ($app["serializer.namingStrategy"]) {
case "IdenticalProperty":
$namingStrategy = new IdenticalPropertyNamingStrategy();
break;
case "CamelCase":
$namingStrategy = new CamelCaseNamingStrategy(
$app["serializer.namingStrategy.separator"],
$app["serializer.namingStrategy.lowerCase"]
);
break;
default:
throw new ServiceUnavailableHttpException(
null,
"Unknown property naming strategy '{$app["serializer.namingStrategy"]}'. " .
"Allowed values are 'IdenticalProperty' or 'CamelCase'"
);
}

$namingStrategy = new SerializedNameAnnotationStrategy($namingStrategy);
}

$serializerBuilder->setPropertyNamingStrategy($namingStrategy);
}

/**
* Override default serialization vistors
*
* @param Container $app
* @param SerializerBuilder $serializerBuilder
*/
protected function setSerializationVisitors(Container $app, SerializerBuilder $serializerBuilder)
{
$serializerBuilder->addDefaultSerializationVisitors();

foreach ($app["serializer.serializationVisitors"] as $format => $visitor) {
$serializerBuilder->setSerializationVisitor($format, $visitor);
}
}

/**
* Override default deserialization visitors
*
* @param Container $app
* @param SerializerBuilder $serializerBuilder
*/
protected function setDeserializationVisitors(Container $app, SerializerBuilder $serializerBuilder)
{
$serializerBuilder->addDefaultDeserializationVisitors();

foreach ($app["serializer.deserializationVisitors"] as $format => $visitor) {
$serializerBuilder->setDeserializationVisitor($format, $visitor);
}
}
}
49 changes: 49 additions & 0 deletions src/PropertyNamingStrategyService.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<?php

namespace JDesrosiers\Silex\Provider;

use JMS\Serializer\Naming\CamelCaseNamingStrategy;
use JMS\Serializer\Naming\IdenticalPropertyNamingStrategy;
use JMS\Serializer\Naming\PropertyNamingStrategyInterface;
use JMS\Serializer\Naming\SerializedNameAnnotationStrategy;
use Pimple\Container;
use Symfony\Component\HttpKernel\Exception\ServiceUnavailableHttpException;

class PropertyNamingStrategyService
{
/**
* Set the serialization naming strategy
*
* @param Container $app
* @return PropertyNamingStrategyInterface
*
* @throws ServiceUnavailableHttpException
*/
public function __invoke(Container $app)
{
if ($app["serializer.namingStrategy"] instanceof PropertyNamingStrategyInterface) {
$namingStrategy = $app["serializer.namingStrategy"];
} else {
switch ($app["serializer.namingStrategy"]) {
case "IdenticalProperty":
$namingStrategy = new IdenticalPropertyNamingStrategy();
break;
case "CamelCase":
$separator = $app["serializer.namingStrategy.separator"];
$lowerCase = $app["serializer.namingStrategy.lowerCase"];
$namingStrategy = new CamelCaseNamingStrategy($separator, $lowerCase);
break;
default:
throw new ServiceUnavailableHttpException(
null,
"Unknown property naming strategy '{$app["serializer.namingStrategy"]}'. " .
"Allowed values are 'IdenticalProperty' or 'CamelCase'"
);
}

$namingStrategy = new SerializedNameAnnotationStrategy($namingStrategy);
}

return $namingStrategy;
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?php

namespace JDesrosiers\Tests\Silex\Provider;
namespace JDesrosiers\Tests\Silex\Provider\Test;

use JDesrosiers\Silex\Provider\JmsSerializerServiceProvider;
use Silex\Application;
Expand Down

0 comments on commit a7d2835

Please sign in to comment.