[Form] added `CallbackChoiceLoader`

This commit is contained in:
Jules Pietri 2016-03-30 20:37:02 +02:00
parent e7077605bb
commit afd7bf8d56
3 changed files with 183 additions and 0 deletions

View File

@ -1,6 +1,11 @@
CHANGELOG
=========
3.2.0
-----
* added `CallbackChoiceLoader`
3.1.0
-----

View File

@ -0,0 +1,77 @@
<?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\Form\ChoiceList\Loader;
use Symfony\Component\Form\ChoiceList\ArrayChoiceList;
/**
* Loads an {@link ArrayChoiceList} instance from a callable returning an array of choices.
*
* @author Jules Pietri <jules@heahprod.com>
*/
class CallbackChoiceLoader implements ChoiceLoaderInterface
{
private $callback;
/**
* The loaded choice list.
*
* @var ArrayChoiceList
*/
private $choiceList;
/**
* @param callable $callback The callable returning an array of choices
*/
public function __construct(callable $callback)
{
$this->callback = $callback;
}
/**
* {@inheritdoc}
*/
public function loadChoiceList($value = null)
{
if (null !== $this->choiceList) {
return $this->choiceList;
}
return $this->choiceList = new ArrayChoiceList(call_user_func($this->callback), $value);
}
/**
* {@inheritdoc}
*/
public function loadChoicesForValues(array $values, $value = null)
{
// Optimize
if (empty($values)) {
return array();
}
return $this->loadChoiceList($value)->getChoicesForValues($values);
}
/**
* {@inheritdoc}
*/
public function loadValuesForChoices(array $choices, $value = null)
{
// Optimize
if (empty($choices)) {
return array();
}
return $this->loadChoiceList($value)->getValuesForChoices($choices);
}
}

View File

@ -0,0 +1,101 @@
<?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\Form\Tests\ChoiceList\Loader;
use Symfony\Component\Form\ChoiceList\LazyChoiceList;
use Symfony\Component\Form\ChoiceList\Loader\CallbackChoiceLoader;
/**
* @author Jules Pietri <jules@heahprod.com>
*/
class CallbackChoiceLoaderTest extends \PHPUnit_Framework_TestCase
{
/**
* @var \Symfony\Component\Form\ChoiceList\Loader\CallbackChoiceLoader
*/
static private $loader;
/**
* @var callable
*/
static private $value;
/**
* @var array
*/
static private $choices;
/**
* @var string[]
*/
static private $choiceValues;
/**
* @var \Symfony\Component\Form\ChoiceList\LazyChoiceList
*/
static private $lazyChoiceList;
static public function setUpBeforeClass()
{
self::$loader = new CallbackChoiceLoader(function() {
return self::$choices;
});
self::$value = function ($choice) {
return isset($choice->value) ? $choice->value : null;
};
self::$choices = array(
(object) array('value' => 'choice_one'),
(object) array('value' => 'choice_two'),
);
self::$choiceValues = array('choice_one', 'choice_two');
self::$lazyChoiceList = new LazyChoiceList(self::$loader, self::$value);
}
public function testLoadChoiceList()
{
$this->assertInstanceOf('\Symfony\Component\Form\ChoiceList\ChoiceListInterface', self::$loader->loadChoiceList(self::$value));
}
public function testLoadChoiceListOnlyOnce()
{
$loadedChoiceList = self::$loader->loadChoiceList(self::$value);
$this->assertSame($loadedChoiceList, self::$loader->loadChoiceList(self::$value));
}
public function testLoadChoicesForValuesLoadsChoiceListOnFirstCall()
{
$this->assertSame(
self::$loader->loadChoicesForValues(self::$choiceValues, self::$value),
self::$lazyChoiceList->getChoicesForValues(self::$choiceValues),
'Choice list should not be reloaded.'
);
}
public function testLoadValuesForChoicesLoadsChoiceListOnFirstCall()
{
$this->assertSame(
self::$loader->loadValuesForChoices(self::$choices, self::$value),
self::$lazyChoiceList->getValuesForChoices(self::$choices),
'Choice list should not be reloaded.'
);
}
static public function tearDownAfterClass()
{
self::$loader = null;
self::$value = null;
self::$choices = array();
self::$choiceValues = array();
self::$lazyChoiceList = null;
}
}