Skip to content
This repository has been archived by the owner on Jan 30, 2020. It is now read-only.

Commit

Permalink
Show file tree
Hide file tree
Showing 8 changed files with 462 additions and 10 deletions.
46 changes: 46 additions & 0 deletions src/Adapter/Service/DbSelectFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @package Zend_Paginator
*/

namespace Zend\Paginator\Adapter\Service;

use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

/**
* @category Zend
* @package Paginator
*/
class DbSelectFactory implements FactoryInterface
{
/**
* Adapter options
* @var array
*/
protected $creationOptions;

/**
* Construct with adapter options
* @param array $creationOptions
*/
public function __construct(array $creationOptions)
{
$this->creationOptions = $creationOptions;
}

/**
* @param ServiceLocatorInterface $serviceLocator
* @return \Zend\Navigation\Navigation
*/
public function createService(ServiceLocatorInterface $serviceLocator)
{
$class = new \ReflectionClass('Zend\Paginator\Adapter\DbSelect');
return $class->newInstanceArgs($this->creationOptions);
}
}
88 changes: 88 additions & 0 deletions src/AdapterPluginManager.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @package Zend_Paginator
*/

namespace Zend\Paginator;

use Zend\ServiceManager\AbstractPluginManager;

/**
* Plugin manager implementation for paginator adapters.
*
* Enforces that adapters retrieved are instances of
* Adapter\AdapterInterface. Additionally, it registers a number of default
* adapters available.
*
* @category Zend
* @package Zend_Paginator
*/
class AdapterPluginManager extends AbstractPluginManager
{
/**
* Default set of adapters
*
* @var array
*/
protected $invokableClasses = array(
'array' => 'Zend\Paginator\Adapter\ArrayAdapter',
'iterator' => 'Zend\Paginator\Adapter\Iterator',
'null' => 'Zend\Paginator\Adapter\Null',
);

/**
* Default set of adapter factories
*
* @var array
*/
protected $factories = array(
'dbselect' => 'Zend\Paginator\Adapter\Service\DbSelectFactory'
);

/**
* Attempt to create an instance via a factory
*
* @param string $canonicalName
* @param string $requestedName
* @return mixed
* @throws Exception\ServiceNotCreatedException If factory is not callable
*/
protected function createFromFactory($canonicalName, $requestedName)
{
$factory = $this->factories[$canonicalName];
if (is_string($factory) && class_exists($factory, true)) {
$factory = new $factory($this->creationOptions);
$this->factories[$canonicalName] = $factory;
}
return parent::createFromFactory($canonicalName, $requestedName);
}

/**
* Validate the plugin
*
* Checks that the adapter loaded is an instance
* of Adapter\AdapterInterface.
*
* @param mixed $plugin
* @return void
* @throws Exception\RuntimeException if invalid
*/
public function validatePlugin($plugin)
{
if ($plugin instanceof Adapter\AdapterInterface) {
// we're okay
return;
}

throw new Exception\RuntimeException(sprintf(
'Plugin of type %s is invalid; must implement %s\Adapter\AdapterInterface',
(is_object($plugin) ? get_class($plugin) : gettype($plugin)),
__NAMESPACE__
));
}
}
114 changes: 114 additions & 0 deletions src/Factory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @package Zend_Paginator
*/

namespace Zend\Paginator;

use Traversable;
use Zend\Paginator\Adapter\AdapterInterface;
use Zend\Stdlib\ArrayUtils;

/**
* @category Zend
* @package Zend_Paginator
*/
abstract class Factory
{
/**
* Adapter plugin manager
* @var AdapterPluginManager
*/
protected static $adapters;

/**
* Create adapter from items if necessary, and return paginator
* @param Traversable/array $items
* @return Paginator
*/
protected static function createAdapterFromItems($items)
{
if ($items instanceof Traversable) {
$items = ArrayUtils::iteratorToArray($items);
}
if (!is_array($items)) {
throw new Exception\InvalidArgumentException(
'The factory needs an associative array '
. 'or a Traversable object as an argument when '
. "it's used with one parameter"
);
}
if (!isset($items['adapter']) && !isset($items['items'])) {
throw new Exception\InvalidArgumentException(
'The factory needs an associative array '
. 'or a Traversable object with keys '
. '"adapter" and "items"'
);
}
$adapter = $items['adapter'];
$items = $items['items'];

$paginator = static::getAdapterFromManager($items, $adapter);
return $paginator;
}

/**
* Get adapter from manager if necessary, and return paginator
* @param mixed $items
* @param mixed $adapter
* @return Paginator
*/
protected static function getAdapterFromManager($items, $adapter)
{
if ($adapter instanceof AdapterInterface || $adapter instanceof AdapterAggregateInterface) {
return new Paginator($adapter);
}
$adapter = static::getAdapterPluginManager()->get($adapter, $items);
return new Paginator($adapter);
}

/**
* Create paginator with items and adapter
* @param mixed $items
* @param mixed $adapter
* @return Paginator
*/
public static function factory($items, $adapter = null)
{
if (null === $adapter) {
$paginator = static::createAdapterFromItems($items);
return $paginator;
}
$paginator = static::getAdapterFromManager($items, $adapter);
return $paginator;
}

/**
* Change the adapter plugin manager
*
* @param AdapterPluginManager $adapters
* @return void
*/
public static function setAdapterPluginManager(AdapterPluginManager $adapters)
{
static::$adapters = $adapters;
}

/**
* Get the adapter plugin manager
*
* @return AdapterPluginManager
*/
public static function getAdapterPluginManager()
{
if (static::$adapters === null) {
static::$adapters = new AdapterPluginManager();
}
return static::$adapters;
}
}
3 changes: 1 addition & 2 deletions src/Paginator.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@

use ArrayIterator;
use Countable;
use Iterator;
use IteratorAggregate;
use Traversable;
use Zend\Cache\Storage\IteratorInterface as CacheIterator;
Expand Down Expand Up @@ -287,7 +286,7 @@ public function __construct($adapter)
$this->adapter = $adapter->getPaginatorAdapter();
} else {
throw new Exception\InvalidArgumentException(
'Zend_Paginator only accepts instances of the type ' .
'Zend\Paginator only accepts instances of the type ' .
'Zend\Paginator\Adapter\AdapterInterface or Zend\Paginator\AdapterAggregateInterface.'
);
}
Expand Down
77 changes: 77 additions & 0 deletions test/AdapterPluginManagerTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @package Zend_Paginator
*/

namespace ZendTest\Paginator;

use Zend\Paginator\AdapterPluginManager;
use Zend\ServiceManager\ServiceManager;
use Zend\Mvc\Service\ServiceManagerConfig;

/**
* @category Zend
* @package Zend_Paginator
* @subpackage UnitTests
* @group Zend_Paginator
*/
class AdapterPluginManagerTest extends \PHPUnit_Framework_TestCase
{
protected $adapaterPluginManager;

/** @var \PHPUnit_Framework_MockObject_MockObject */
protected $mockSelect;

protected $mockAdapter;

protected function setUp()
{
$this->adapaterPluginManager = new AdapterPluginManager();
$this->mockSelect = $this->getMock('Zend\Db\Sql\Select');

$mockStatement = $this->getMock('Zend\Db\Adapter\Driver\StatementInterface');
$mockResult = $this->getMock('Zend\Db\Adapter\Driver\ResultInterface');

$mockDriver = $this->getMock('Zend\Db\Adapter\Driver\DriverInterface');
$mockDriver->expects($this->any())->method('createStatement')->will($this->returnValue($mockStatement));
$mockStatement->expects($this->any())->method('execute')->will($this->returnValue($mockResult));
$mockPlatform = $this->getMock('Zend\Db\Adapter\Platform\PlatformInterface');
$mockPlatform->expects($this->any())->method('getName')->will($this->returnValue('platform'));

$this->mockAdapter = $this->getMockForAbstractClass(
'Zend\Db\Adapter\Adapter',
array($mockDriver, $mockPlatform)
);
}

public function testCanRetrieveAdapterPlugin()
{
$plugin = $this->adapaterPluginManager->get('array', array(1, 2, 3));
$this->assertInstanceOf('Zend\Paginator\Adapter\ArrayAdapter', $plugin);
$plugin = $this->adapaterPluginManager->get('iterator', new \ArrayIterator(range(1, 101)));
$this->assertInstanceOf('Zend\Paginator\Adapter\Iterator', $plugin);
$plugin = $this->adapaterPluginManager->get('dbselect', array($this->mockSelect, $this->mockAdapter));
$this->assertInstanceOf('Zend\Paginator\Adapter\DbSelect', $plugin);
$plugin = $this->adapaterPluginManager->get('null', 101);
$this->assertInstanceOf('Zend\Paginator\Adapter\Null', $plugin);
}

public function testCanRetrievePluginManagerWithServiceManager()
{
$sm = $this->serviceManager = new ServiceManager(
new ServiceManagerConfig(array(
'factories' => array(
'PaginatorPluginManager' => 'Zend\Mvc\Service\PaginatorPluginManagerFactory',
),
))
);
$sm->setService('Config', array());
$adapterPluginManager = $sm->get('PaginatorPluginManager');
$this->assertInstanceOf('Zend\Paginator\AdapterPluginManager', $adapterPluginManager);
}
}
Loading

0 comments on commit c2442b4

Please sign in to comment.