diff options
Diffstat (limited to 'Encoder')
-rw-r--r-- | Encoder/EncoderFactory.php | 77 | ||||
-rw-r--r-- | Encoder/EncoderFactoryInterface.php | 30 |
2 files changed, 107 insertions, 0 deletions
diff --git a/Encoder/EncoderFactory.php b/Encoder/EncoderFactory.php new file mode 100644 index 0000000..5462ac2 --- /dev/null +++ b/Encoder/EncoderFactory.php @@ -0,0 +1,77 @@ +<?php + +namespace Symfony\Component\Security\Encoder; + +use Symfony\Component\Security\User\AccountInterface; + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien.potencier@symfony-project.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * A generic encoder factory implementation + * + * @author Johannes M. Schmitt <schmittjoh@gmail.com> + */ +class EncoderFactory implements EncoderFactoryInterface +{ + protected $encoders; + protected $encoderMap; + + public function __construct(array $encoderMap) + { + $this->encoders = array(); + $this->encoderMap = $encoderMap; + } + + /** + * {@inheritDoc} + */ + public function getEncoder(AccountInterface $account) + { + foreach ($this->encoders as $class => $encoder) { + if ($account instanceof $class) { + return $encoder; + } + } + + return $this->createEncoder($account); + } + + /** + * Adds an encoder instance to the factory + * + * @param string $class + * @param PasswordEncoderInterface $encoder + * @return void + */ + public function addEncoder($class, PasswordEncoderInterface $encoder) + { + $this->encoders[$class] = $encoder; + } + + /** + * Creates the actual encoder instance + * + * @param AccountInterface $account + * @return PasswordEncoderInterface + */ + protected function createEncoder($account) + { + foreach ($this->encoderMap as $class => $config) { + if ($account instanceof $class) { + $reflection = new \ReflectionClass($config['class']); + $this->encoders[$class] = $reflection->newInstanceArgs($config['arguments']); + + return $this->encoders[$class]; + } + } + + throw new \InvalidArgumentException(sprintf('No encoder has been configured for account "%s".', get_class($account))); + } +}
\ No newline at end of file diff --git a/Encoder/EncoderFactoryInterface.php b/Encoder/EncoderFactoryInterface.php new file mode 100644 index 0000000..0c62b35 --- /dev/null +++ b/Encoder/EncoderFactoryInterface.php @@ -0,0 +1,30 @@ +<?php + +namespace Symfony\Component\Security\Encoder; + +use Symfony\Component\Security\User\AccountInterface; + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien.potencier@symfony-project.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * EncoderFactoryInterface to support different encoders for different accounts. + * + * @author Johannes M. Schmitt <schmittjoh@gmail.com> + */ +interface EncoderFactoryInterface +{ + /** + * Returns the password encoder to use for the given account + * + * @param AccountInterface $account + * @return PasswordEncoderInterface never null + */ + function getEncoder(AccountInterface $account); +}
\ No newline at end of file |