2015-08-17 17:00:26 -07:00
< ? php
/*
* This file is part of the Symfony package .
*
* ( c ) Fabien Potencier < fabien @ symfony . com >
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
namespace Symfony\Component\Serializer\NameConverter ;
/**
* CamelCase to Underscore name converter .
*
* @ author Kévin Dunglas < dunglas @ gmail . com >
*/
class CamelCaseToSnakeCaseNameConverter implements NameConverterInterface
{
/**
* @ var array | null
*/
private $attributes ;
2016-04-20 09:56:34 -07:00
2015-08-17 17:00:26 -07:00
/**
* @ var bool
*/
private $lowerCamelCase ;
/**
2017-02-02 16:28:38 -08:00
* @ param null | array $attributes The list of attributes to rename or null for all attributes
* @ param bool $lowerCamelCase Use lowerCamelCase style
2015-08-17 17:00:26 -07:00
*/
public function __construct ( array $attributes = null , $lowerCamelCase = true )
{
$this -> attributes = $attributes ;
$this -> lowerCamelCase = $lowerCamelCase ;
}
/**
* { @ inheritdoc }
*/
public function normalize ( $propertyName )
{
if ( null === $this -> attributes || in_array ( $propertyName , $this -> attributes )) {
2017-04-13 15:53:35 +01:00
$lcPropertyName = lcfirst ( $propertyName );
2015-08-17 17:00:26 -07:00
$snakeCasedName = '' ;
2017-04-13 15:53:35 +01:00
$len = strlen ( $lcPropertyName );
2015-10-08 11:40:12 -07:00
for ( $i = 0 ; $i < $len ; ++ $i ) {
2017-04-13 15:53:35 +01:00
if ( ctype_upper ( $lcPropertyName [ $i ])) {
$snakeCasedName .= '_' . strtolower ( $lcPropertyName [ $i ]);
2015-08-17 17:00:26 -07:00
} else {
2017-04-13 15:53:35 +01:00
$snakeCasedName .= strtolower ( $lcPropertyName [ $i ]);
2015-08-17 17:00:26 -07:00
}
}
return $snakeCasedName ;
}
return $propertyName ;
}
/**
* { @ inheritdoc }
*/
public function denormalize ( $propertyName )
{
$camelCasedName = preg_replace_callback ( '/(^|_|\.)+(.)/' , function ( $match ) {
return ( '.' === $match [ 1 ] ? '_' : '' ) . strtoupper ( $match [ 2 ]);
}, $propertyName );
if ( $this -> lowerCamelCase ) {
$camelCasedName = lcfirst ( $camelCasedName );
}
if ( null === $this -> attributes || in_array ( $camelCasedName , $this -> attributes )) {
2017-04-13 15:53:35 +01:00
return $camelCasedName ;
2015-08-17 17:00:26 -07:00
}
return $propertyName ;
}
}