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\Encoder ;
use Symfony\Component\Serializer\Exception\RuntimeException ;
/**
* Encoder delegating the decoding to a chain of encoders .
*
* @ author Jordi Boggiano < j . boggiano @ seld . be >
* @ author Johannes M . Schmitt < schmittjoh @ gmail . com >
* @ author Lukas Kahwe Smith < smith @ pooteeweet . org >
2018-11-23 12:29:20 +00:00
*
* @ final since version 3.3 .
2015-08-17 17:00:26 -07:00
*/
2018-11-23 12:29:20 +00:00
class ChainEncoder implements EncoderInterface /*, ContextAwareEncoderInterface*/
2015-08-17 17:00:26 -07:00
{
protected $encoders = array ();
protected $encoderByFormat = array ();
public function __construct ( array $encoders = array ())
{
$this -> encoders = $encoders ;
}
/**
* { @ inheritdoc }
*/
final public function encode ( $data , $format , array $context = array ())
{
2018-11-23 12:29:20 +00:00
return $this -> getEncoder ( $format , $context ) -> encode ( $data , $format , $context );
2015-08-17 17:00:26 -07:00
}
/**
* { @ inheritdoc }
*/
2018-11-23 12:29:20 +00:00
public function supportsEncoding ( $format /*, array $context = array()*/ )
2015-08-17 17:00:26 -07:00
{
2018-11-23 12:29:20 +00:00
$context = \func_num_args () > 1 ? func_get_arg ( 1 ) : array ();
2015-08-17 17:00:26 -07:00
try {
2018-11-23 12:29:20 +00:00
$this -> getEncoder ( $format , $context );
2015-08-17 17:00:26 -07:00
} catch ( RuntimeException $e ) {
return false ;
}
return true ;
}
/**
* Checks whether the normalization is needed for the given format .
*
* @ param string $format
2018-11-23 12:29:20 +00:00
* @ param array $context
2015-08-17 17:00:26 -07:00
*
* @ return bool
*/
2018-11-23 12:29:20 +00:00
public function needsNormalization ( $format /*, array $context = array()*/ )
2015-08-17 17:00:26 -07:00
{
2018-11-23 12:29:20 +00:00
$context = \func_num_args () > 1 ? func_get_arg ( 1 ) : array ();
$encoder = $this -> getEncoder ( $format , $context );
2015-08-17 17:00:26 -07:00
if ( ! $encoder instanceof NormalizationAwareInterface ) {
return true ;
}
if ( $encoder instanceof self ) {
2018-11-23 12:29:20 +00:00
return $encoder -> needsNormalization ( $format , $context );
2015-08-17 17:00:26 -07:00
}
return false ;
}
/**
* Gets the encoder supporting the format .
*
* @ param string $format
2018-11-23 12:29:20 +00:00
* @ param array $context
2015-08-17 17:00:26 -07:00
*
* @ return EncoderInterface
*
* @ throws RuntimeException if no encoder is found
*/
2018-11-23 12:29:20 +00:00
private function getEncoder ( $format , array $context )
2015-08-17 17:00:26 -07:00
{
if ( isset ( $this -> encoderByFormat [ $format ])
&& isset ( $this -> encoders [ $this -> encoderByFormat [ $format ]])
) {
return $this -> encoders [ $this -> encoderByFormat [ $format ]];
}
foreach ( $this -> encoders as $i => $encoder ) {
2018-11-23 12:29:20 +00:00
if ( $encoder -> supportsEncoding ( $format , $context )) {
2015-08-17 17:00:26 -07:00
$this -> encoderByFormat [ $format ] = $i ;
return $encoder ;
}
}
throw new RuntimeException ( sprintf ( 'No encoder found for format "%s".' , $format ));
}
}