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 ;
/**
* Decoder delegating the decoding to a chain of decoders .
*
* @ 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 ChainDecoder implements DecoderInterface /*, ContextAwareDecoderInterface*/
2015-08-17 17:00:26 -07:00
{
protected $decoders = array ();
protected $decoderByFormat = array ();
public function __construct ( array $decoders = array ())
{
$this -> decoders = $decoders ;
}
/**
* { @ inheritdoc }
*/
final public function decode ( $data , $format , array $context = array ())
{
2018-11-23 12:29:20 +00:00
return $this -> getDecoder ( $format , $context ) -> decode ( $data , $format , $context );
2015-08-17 17:00:26 -07:00
}
/**
* { @ inheritdoc }
*/
2018-11-23 12:29:20 +00:00
public function supportsDecoding ( $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 -> getDecoder ( $format , $context );
2015-08-17 17:00:26 -07:00
} catch ( RuntimeException $e ) {
return false ;
}
return true ;
}
/**
* Gets the decoder 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 DecoderInterface
*
2018-11-23 12:29:20 +00:00
* @ throws RuntimeException if no decoder is found
2015-08-17 17:00:26 -07:00
*/
2018-11-23 12:29:20 +00:00
private function getDecoder ( $format , array $context )
2015-08-17 17:00:26 -07:00
{
if ( isset ( $this -> decoderByFormat [ $format ])
&& isset ( $this -> decoders [ $this -> decoderByFormat [ $format ]])
) {
return $this -> decoders [ $this -> decoderByFormat [ $format ]];
}
foreach ( $this -> decoders as $i => $decoder ) {
2018-11-23 12:29:20 +00:00
if ( $decoder -> supportsDecoding ( $format , $context )) {
2015-08-17 17:00:26 -07:00
$this -> decoderByFormat [ $format ] = $i ;
return $decoder ;
}
}
throw new RuntimeException ( sprintf ( 'No decoder found for format "%s".' , $format ));
}
}