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\HttpFoundation ;
/**
* Represents an Accept -* header .
*
* An accept header is compound with a list of items ,
* sorted by descending quality .
*
* @ author Jean - François Simon < contact @ jfsimon . fr >
*/
class AcceptHeader
{
/**
* @ var AcceptHeaderItem []
*/
private $items = array ();
/**
* @ var bool
*/
private $sorted = true ;
/**
* Constructor .
*
* @ param AcceptHeaderItem [] $items
*/
public function __construct ( array $items )
{
foreach ( $items as $item ) {
$this -> add ( $item );
}
}
/**
* Builds an AcceptHeader instance from a string .
*
* @ param string $headerValue
*
2017-02-02 16:28:38 -08:00
* @ return self
2015-08-17 17:00:26 -07:00
*/
public static function fromString ( $headerValue )
{
$index = 0 ;
return new self ( array_map ( function ( $itemValue ) use ( & $index ) {
$item = AcceptHeaderItem :: fromString ( $itemValue );
$item -> setIndex ( $index ++ );
return $item ;
}, preg_split ( '/\s*(?:,*("[^"]+"),*|,*(\'[^\']+\'),*|,+)\s*/' , $headerValue , 0 , PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE )));
}
/**
* Returns header value ' s string representation .
*
* @ return string
*/
public function __toString ()
{
return implode ( ',' , $this -> items );
}
/**
* Tests if header has given value .
*
* @ param string $value
*
* @ return bool
*/
public function has ( $value )
{
return isset ( $this -> items [ $value ]);
}
/**
* Returns given value ' s item , if exists .
*
* @ param string $value
*
* @ return AcceptHeaderItem | null
*/
public function get ( $value )
{
return isset ( $this -> items [ $value ]) ? $this -> items [ $value ] : null ;
}
/**
* Adds an item .
*
* @ param AcceptHeaderItem $item
*
2017-02-02 16:28:38 -08:00
* @ return $this
2015-08-17 17:00:26 -07:00
*/
public function add ( AcceptHeaderItem $item )
{
$this -> items [ $item -> getValue ()] = $item ;
$this -> sorted = false ;
return $this ;
}
/**
* Returns all items .
*
* @ return AcceptHeaderItem []
*/
public function all ()
{
$this -> sort ();
return $this -> items ;
}
/**
* Filters items on their value using given regex .
*
* @ param string $pattern
*
2017-02-02 16:28:38 -08:00
* @ return self
2015-08-17 17:00:26 -07:00
*/
public function filter ( $pattern )
{
return new self ( array_filter ( $this -> items , function ( AcceptHeaderItem $item ) use ( $pattern ) {
return preg_match ( $pattern , $item -> getValue ());
}));
}
/**
* Returns first item .
*
* @ return AcceptHeaderItem | null
*/
public function first ()
{
$this -> sort ();
return ! empty ( $this -> items ) ? reset ( $this -> items ) : null ;
}
/**
* Sorts items by descending quality .
*/
private function sort ()
{
if ( ! $this -> sorted ) {
uasort ( $this -> items , function ( $a , $b ) {
$qA = $a -> getQuality ();
$qB = $b -> getQuality ();
if ( $qA === $qB ) {
return $a -> getIndex () > $b -> getIndex () ? 1 : - 1 ;
}
return $qA > $qB ? - 1 : 1 ;
});
$this -> sorted = true ;
}
}
}