Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit c553193

Browse filesBrowse files
committed
Documented expressionlanguage extensibility
1 parent ad4c1f0 commit c553193
Copy full SHA for c553193

File tree

Expand file treeCollapse file tree

1 file changed

+51
-14
lines changed
Filter options
Expand file treeCollapse file tree

1 file changed

+51
-14
lines changed

‎components/expression_language/extending.rst

Copy file name to clipboardExpand all lines: components/expression_language/extending.rst
+51-14Lines changed: 51 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -51,24 +51,31 @@ an ``arguments`` variable as their first argument, which is equal to the
5151
second argument to ``evaluate()`` or ``compile()`` (e.g. the "values" when
5252
evaluating or the "names" if compiling).
5353

54-
Creating a new ExpressionLanguage Class
55-
---------------------------------------
54+
Using Expression Providers
55+
--------------------------
5656

57-
When you use the ``ExpressionLanguage`` class in your library, it's recommend
58-
to create a new ``ExpressionLanguage`` class and register the functions there.
59-
Override ``registerFunctions`` to add your own functions::
57+
.. versionadded:: 2.6
58+
Expression providers were introduced in Symfony 2.6.
6059

61-
namespace Acme\AwesomeLib\ExpressionLanguage;
60+
When you use the ``ExpressionLanguage`` class in your library, you often want
61+
to add custom functions. To do so, you can create a new expression provider by
62+
creating a class that implements
63+
:class:`Symfony\\Component\\ExpressionLanguage\\ExpressionFunctionProviderInterface`.
6264

63-
use Symfony\Component\ExpressionLanguage\ExpressionLanguage as BaseExpressionLanguage;
65+
This interface requires one method:
66+
:method:`Symfony\\Component\\ExpressionLanguage\\ExpressionFunctionProviderInterface::getFunctions`.
67+
This method returns an array of expression functions (instances of
68+
:class:`Symfony\\Component\\ExpressionLanguage\\ExpressionFunction`) to register.
6469

65-
class ExpressionLanguage extends BaseExpressionLanguage
66-
{
67-
protected function registerFunctions()
68-
{
69-
parent::registerFunctions(); // do not forget to also register core functions
70+
.. code-block:: php
7071
71-
$this->register('lowercase', function ($str) {
72+
use Symfony\Component\ExpressionLanguage\ExpressionFunction;
73+
use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface;
74+
75+
class StringExpressionLanguageProvider implements ExpressionFunctionProviderInterface
76+
{
77+
return array(
78+
new ExpressionFunction('lowercase', function ($str) {
7279
return sprintf('(is_string(%1$s) ? strtolower(%1$s) : %1$s)', $str);
7380
}, function ($arguments, $str) {
7481
if (!is_string($str)) {
@@ -77,5 +84,35 @@ Override ``registerFunctions`` to add your own functions::
7784
7885
return strtolower($str);
7986
});
80-
}
87+
);
8188
}
89+
90+
You can register providers using
91+
:method:`Symfony\\Component\\ExpressionLanguage\\ExpressionLanguage::registerProvider`
92+
or by using the second argument of the constructor::
93+
94+
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
95+
96+
// using the constructor
97+
$language = new ExpressionLanguage(null, array(...));
98+
99+
$language->registerProvider(new StringExpressionLanguageProvider());
100+
101+
.. tip::
102+
103+
It is recommended to create your own ``ExpressionLanguage`` class in your
104+
library. Now you can add the extension by overriding the constructor::
105+
106+
use Symfony\Component\ExpressionLanguage\ExpressionLanguage as BaseExpressionLanguage;
107+
use Symfony\Component\ExpressionLanguage\ParserCache\ParserCacheInterface;
108+
109+
class ExpressionLanguage extends BaseExpressionLanguage
110+
{
111+
public function __construct(ParserCacheInterface $parser = null, array $providers = array())
112+
{
113+
// prepend the default provider to let users override it easily
114+
array_unshift($providers, new MyExpressionLanguageProvider());
115+
116+
parent::__construct($parser, $providers);
117+
}
118+
}

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.