2015-08-17 17:00:26 -07:00
< ? php
2016-10-06 15:16:20 -07:00
/*
2015-08-17 17:00:26 -07:00
* This file is part of the Symfony CMF package .
*
2016-10-06 15:16:20 -07:00
* ( c ) 2011 - 2015 Symfony CMF
2015-08-17 17:00:26 -07:00
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
namespace Symfony\Cmf\Component\Routing ;
/**
* Provides a route collection which avoids having all routes in memory .
*
* Internally , this does load multiple routes over time using a
* PagedRouteProviderInterface $route_provider .
*/
class PagedRouteCollection implements \Iterator , \Countable
{
/**
* @ var PagedRouteProviderInterface
*/
protected $provider ;
/**
* Stores the amount of routes which are loaded in parallel and kept in
* memory .
*
* @ var int
*/
protected $routesBatchSize ;
/**
* Contains the current item the iterator points to .
*
* @ var int
*/
protected $current = - 1 ;
/**
* Stores the current loaded routes .
*
* @ var \Symfony\Component\Routing\Route []
*/
protected $currentRoutes ;
public function __construct ( PagedRouteProviderInterface $pagedRouteProvider , $routesBatchSize = 50 )
{
$this -> provider = $pagedRouteProvider ;
$this -> routesBatchSize = $routesBatchSize ;
}
/**
* Loads the next routes into the elements array .
*
* @ param int $offset The offset used in the db query .
*/
protected function loadNextElements ( $offset )
{
// If the last batch was smaller than the batch size, this means there
// are no more routes available.
if ( isset ( $this -> currentRoutes ) && count ( $this -> currentRoutes ) < $this -> routesBatchSize ) {
$this -> currentRoutes = array ();
} else {
$this -> currentRoutes = $this -> provider -> getRoutesPaged ( $offset , $this -> routesBatchSize );
}
}
/**
* { @ inheritdoc }
*/
public function current ()
{
return current ( $this -> currentRoutes );
}
/**
* { @ inheritdoc }
*/
public function next ()
{
$result = next ( $this -> currentRoutes );
if ( false === $result ) {
$this -> loadNextElements ( $this -> current + 1 );
}
2016-10-06 15:16:20 -07:00
++ $this -> current ;
2015-08-17 17:00:26 -07:00
}
/**
* { @ inheritdoc }
*/
public function key ()
{
return key ( $this -> currentRoutes );
}
/**
* { @ inheritdoc }
*/
public function valid ()
{
return key ( $this -> currentRoutes );
}
/**
* { @ inheritdoc }
*/
public function rewind ()
{
$this -> current = 0 ;
2016-10-06 15:16:20 -07:00
$this -> currentRoutes = null ;
2015-08-17 17:00:26 -07:00
$this -> loadNextElements ( $this -> current );
}
/**
* Gets the number of Routes in this collection .
*
* @ return int The number of routes
*/
public function count ()
{
return $this -> provider -> getRoutesCount ();
}
}