diff options
author | Fabien Potencier <fabien.potencier@gmail.com> | 2014-09-28 13:22:15 +0200 |
---|---|---|
committer | Fabien Potencier <fabien.potencier@gmail.com> | 2014-09-28 13:22:15 +0200 |
commit | beb901f75e8016b254fb64ebf477e92a7b001122 (patch) | |
tree | e2823fe123140048e18914c3294045cd7dee05d7 /Core | |
parent | 1e5a6bb4b4393102d52b294a9e426a2bafa877b4 (diff) | |
parent | 8f706dec8d6c094cd92ef275588e4bc248d577a7 (diff) | |
download | symfony-security-beb901f75e8016b254fb64ebf477e92a7b001122.zip symfony-security-beb901f75e8016b254fb64ebf477e92a7b001122.tar.gz symfony-security-beb901f75e8016b254fb64ebf477e92a7b001122.tar.bz2 |
feature #12006 Expression language extensibility (fabpot)
This PR was merged into the 2.6-dev branch.
Discussion
----------
Expression language extensibility
| Q | A
| ------------- | ---
| Bug fix? | no
| New feature? | yes
| BC breaks? | no
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets | #10512
| License | MIT
| Doc PR | not yet
The way we can add functions to an ExpressionLanguage instance is by using inheritance. #10512 tries to make the expression language in the routing flexible but using inheritance won't work when several bundles want to add functions.
So, this PR takes another approach to solve the problem globally.
Todo:
* [x] add some more tests
* [ ] add some docs
Commits
-------
7c24188 [FrameworkBundle] added a compiler pass for expression language providers
4195a91 [Routing] added support for custom expression language functions
1a39046 [Security] added support for custom expression language functions
79bcd52b [DependencyInjection] added support for custom expression language functions
184742c [ExpressionLanguage] added ExpressionFunction and ExpressionFunctionProviderInterface
Diffstat (limited to 'Core')
-rw-r--r-- | Core/Authorization/ExpressionLanguage.php | 38 | ||||
-rw-r--r-- | Core/Authorization/ExpressionLanguageProvider.php | 58 |
2 files changed, 65 insertions, 31 deletions
diff --git a/Core/Authorization/ExpressionLanguage.php b/Core/Authorization/ExpressionLanguage.php index f9012b7..ac6a036 100644 --- a/Core/Authorization/ExpressionLanguage.php +++ b/Core/Authorization/ExpressionLanguage.php @@ -12,46 +12,22 @@ namespace Symfony\Component\Security\Core\Authorization; use Symfony\Component\ExpressionLanguage\ExpressionLanguage as BaseExpressionLanguage; +use Symfony\Component\ExpressionLanguage\ParserCache\ParserCacheInterface; /** * Adds some function to the default ExpressionLanguage. * * @author Fabien Potencier <fabien@symfony.com> + * + * @see ExpressionLanguageProvider */ class ExpressionLanguage extends BaseExpressionLanguage { - protected function registerFunctions() + public function __construct(ParserCacheInterface $cache = null, array $providers = array()) { - parent::registerFunctions(); - - $this->register('is_anonymous', function () { - return '$trust_resolver->isAnonymous($token)'; - }, function (array $variables) { - return $variables['trust_resolver']->isAnonymous($variables['token']); - }); - - $this->register('is_authenticated', function () { - return '$token && !$trust_resolver->isAnonymous($token)'; - }, function (array $variables) { - return $variables['token'] && !$variables['trust_resolver']->isAnonymous($variables['token']); - }); - - $this->register('is_fully_authenticated', function () { - return '$trust_resolver->isFullFledged($token)'; - }, function (array $variables) { - return $variables['trust_resolver']->isFullFledged($variables['token']); - }); - - $this->register('is_remember_me', function () { - return '$trust_resolver->isRememberMe($token)'; - }, function (array $variables) { - return $variables['trust_resolver']->isRememberMe($variables['token']); - }); + // prepend the default provider to let users overide it easily + array_unshift($providers, new ExpressionLanguageProvider()); - $this->register('has_role', function ($role) { - return sprintf('in_array(%s, $roles)', $role); - }, function (array $variables, $role) { - return in_array($role, $variables['roles']); - }); + parent::__construct($cache, $providers); } } diff --git a/Core/Authorization/ExpressionLanguageProvider.php b/Core/Authorization/ExpressionLanguageProvider.php new file mode 100644 index 0000000..9293ba7 --- /dev/null +++ b/Core/Authorization/ExpressionLanguageProvider.php @@ -0,0 +1,58 @@ +<?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\Security\Core\Authorization; + +use Symfony\Component\ExpressionLanguage\ExpressionFunction; +use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface; + +/** + * Define some ExpressionLanguage functions. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class ExpressionLanguageProvider implements ExpressionFunctionProviderInterface +{ + public function getFunctions() + { + return array( + new ExpressionFunction('is_anonymous', function () { + return '$trust_resolver->isAnonymous($token)'; + }, function (array $variables) { + return $variables['trust_resolver']->isAnonymous($variables['token']); + }), + + new ExpressionFunction('is_authenticated', function () { + return '$token && !$trust_resolver->isAnonymous($token)'; + }, function (array $variables) { + return $variables['token'] && !$variables['trust_resolver']->isAnonymous($variables['token']); + }), + + new ExpressionFunction('is_fully_authenticated', function () { + return '$trust_resolver->isFullFledged($token)'; + }, function (array $variables) { + return $variables['trust_resolver']->isFullFledged($variables['token']); + }), + + new ExpressionFunction('is_remember_me', function () { + return '$trust_resolver->isRememberMe($token)'; + }, function (array $variables) { + return $variables['trust_resolver']->isRememberMe($variables['token']); + }), + + new ExpressionFunction('has_role', function ($role) { + return sprintf('in_array(%s, $roles)', $role); + }, function (array $variables, $role) { + return in_array($role, $variables['roles']); + }), + ); + } +} |