2024-11-27 11:16:45 +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\HttpFoundation ;
use Symfony\Component\HttpFoundation\Exception\BadRequestException ;
use Symfony\Component\HttpFoundation\Exception\UnexpectedValueException ;
/**
* ParameterBag is a container for key/value pairs.
*
* @author Fabien Potencier <fabien@symfony.com>
*
* @implements \IteratorAggregate<string, mixed>
*/
class ParameterBag implements \IteratorAggregate , \Countable
{
2024-12-02 01:18:34 +07:00
public function __construct (
protected array $parameters = [],
) {
2024-11-27 11:16:45 +07:00
}
/**
* Returns the parameters.
*
* @param string|null $key The name of the parameter to return or null to get them all
*/
public function all ( ? string $key = null ) : array
{
if ( null === $key ) {
return $this -> parameters ;
}
if ( ! \is_array ( $value = $this -> parameters [ $key ] ? ? [])) {
2024-12-02 01:18:34 +07:00
throw new BadRequestException ( \sprintf ( 'Unexpected value for parameter "%s": expecting "array", got "%s".' , $key , get_debug_type ( $value )));
2024-11-27 11:16:45 +07:00
}
return $value ;
}
/**
* Returns the parameter keys.
*/
public function keys () : array
{
return array_keys ( $this -> parameters );
}
/**
* Replaces the current parameters by a new set.
*/
public function replace ( array $parameters = []) : void
{
$this -> parameters = $parameters ;
}
/**
* Adds parameters.
*/
public function add ( array $parameters = []) : void
{
$this -> parameters = array_replace ( $this -> parameters , $parameters );
}
public function get ( string $key , mixed $default = null ) : mixed
{
return \array_key_exists ( $key , $this -> parameters ) ? $this -> parameters [ $key ] : $default ;
}
public function set ( string $key , mixed $value ) : void
{
$this -> parameters [ $key ] = $value ;
}
/**
* Returns true if the parameter is defined.
*/
public function has ( string $key ) : bool
{
return \array_key_exists ( $key , $this -> parameters );
}
/**
* Removes a parameter.
*/
public function remove ( string $key ) : void
{
unset ( $this -> parameters [ $key ]);
}
/**
* Returns the alphabetic characters of the parameter value.
*/
public function getAlpha ( string $key , string $default = '' ) : string
{
return preg_replace ( '/[^[:alpha:]]/' , '' , $this -> getString ( $key , $default ));
}
/**
* Returns the alphabetic characters and digits of the parameter value.
*/
public function getAlnum ( string $key , string $default = '' ) : string
{
return preg_replace ( '/[^[:alnum:]]/' , '' , $this -> getString ( $key , $default ));
}
/**
* Returns the digits of the parameter value.
*/
public function getDigits ( string $key , string $default = '' ) : string
{
return preg_replace ( '/[^[:digit:]]/' , '' , $this -> getString ( $key , $default ));
}
/**
* Returns the parameter as string.
*/
public function getString ( string $key , string $default = '' ) : string
{
$value = $this -> get ( $key , $default );
if ( ! \is_scalar ( $value ) && ! $value instanceof \Stringable ) {
2024-12-02 01:18:34 +07:00
throw new UnexpectedValueException ( \sprintf ( 'Parameter value "%s" cannot be converted to "string".' , $key ));
2024-11-27 11:16:45 +07:00
}
return ( string ) $value ;
}
/**
* Returns the parameter value converted to integer.
*/
public function getInt ( string $key , int $default = 0 ) : int
{
return $this -> filter ( $key , $default , \FILTER_VALIDATE_INT , [ 'flags' => \FILTER_REQUIRE_SCALAR ]);
}
/**
* Returns the parameter value converted to boolean.
*/
public function getBoolean ( string $key , bool $default = false ) : bool
{
return $this -> filter ( $key , $default , \FILTER_VALIDATE_BOOL , [ 'flags' => \FILTER_REQUIRE_SCALAR ]);
}
/**
* Returns the parameter value converted to an enum.
*
* @template T of \BackedEnum
*
* @param class-string<T> $class
* @param ?T $default
*
* @return ?T
*
* @psalm-return ($default is null ? T|null : T)
*/
public function getEnum ( string $key , string $class , ? \BackedEnum $default = null ) : ? \BackedEnum
{
$value = $this -> get ( $key );
if ( null === $value ) {
return $default ;
}
try {
return $class :: from ( $value );
} catch ( \ValueError | \TypeError $e ) {
2024-12-02 01:18:34 +07:00
throw new UnexpectedValueException ( \sprintf ( 'Parameter "%s" cannot be converted to enum: %s.' , $key , $e -> getMessage ()), $e -> getCode (), $e );
2024-11-27 11:16:45 +07:00
}
}
/**
* Filter key.
*
* @param int $filter FILTER_* constant
* @param int|array{flags?: int, options?: array} $options Flags from FILTER_* constants
*
* @see https://php.net/filter-var
*/
public function filter ( string $key , mixed $default = null , int $filter = \FILTER_DEFAULT , mixed $options = []) : mixed
{
$value = $this -> get ( $key , $default );
// Always turn $options into an array - this allows filter_var option shortcuts.
if ( ! \is_array ( $options ) && $options ) {
$options = [ 'flags' => $options ];
}
// Add a convenience check for arrays.
if ( \is_array ( $value ) && ! isset ( $options [ 'flags' ])) {
$options [ 'flags' ] = \FILTER_REQUIRE_ARRAY ;
}
if ( \is_object ( $value ) && ! $value instanceof \Stringable ) {
2024-12-02 01:18:34 +07:00
throw new UnexpectedValueException ( \sprintf ( 'Parameter value "%s" cannot be filtered.' , $key ));
2024-11-27 11:16:45 +07:00
}
if (( \FILTER_CALLBACK & $filter ) && ! (( $options [ 'options' ] ? ? null ) instanceof \Closure )) {
2024-12-02 01:18:34 +07:00
throw new \InvalidArgumentException ( \sprintf ( 'A Closure must be passed to "%s()" when FILTER_CALLBACK is used, "%s" given.' , __METHOD__ , get_debug_type ( $options [ 'options' ] ? ? null )));
2024-11-27 11:16:45 +07:00
}
$options [ 'flags' ] ? ? = 0 ;
$nullOnFailure = $options [ 'flags' ] & \FILTER_NULL_ON_FAILURE ;
$options [ 'flags' ] |= \FILTER_NULL_ON_FAILURE ;
$value = filter_var ( $value , $filter , $options );
if ( null !== $value || $nullOnFailure ) {
return $value ;
}
2024-12-02 01:18:34 +07:00
throw new \UnexpectedValueException ( \sprintf ( 'Parameter value "%s" is invalid and flag "FILTER_NULL_ON_FAILURE" was not set.' , $key ));
2024-11-27 11:16:45 +07:00
}
/**
* Returns an iterator for parameters.
*
* @return \ArrayIterator<string, mixed>
*/
public function getIterator () : \ArrayIterator
{
return new \ArrayIterator ( $this -> parameters );
}
/**
* Returns the number of parameters.
*/
public function count () : int
{
return \count ( $this -> parameters );
}
}