Skip to content

Commit 696be66

Browse files
fabpotjaviereguiluz
authored andcommitted
Format syntaxes reference
1 parent 174db69 commit 696be66

File tree

14 files changed

+712
-685
lines changed

14 files changed

+712
-685
lines changed

_build/redirection_map

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -537,8 +537,10 @@
537537
/components/security/secure_tools /security/passwords
538538
/components/security /security
539539
/components/var_dumper/advanced /components/var_dumper#advanced-usage
540-
/components/yaml/yaml_format /components/yaml#yaml-format
541-
/components/expression_language/syntax /components/expression_language#expression-language-syntax
540+
/components/yaml/yaml_format /reference/formats/yaml
541+
/components/expression_language/syntax /reference/formats/expression_language
542+
/components/expression_language/ast /components/expression_language#expression-language-ast
543+
/components/expression_language/caching /components/expression_language#expression-language-caching
542544
/components/expression_language/extending /components/expression_language#expression-language-extending
543545
/notifier/chatters /notifier#sending-chat-messages
544546
/notifier/texters /notifier#sending-sms

components/expression_language.rst

Lines changed: 6 additions & 309 deletions
Original file line numberDiff line numberDiff line change
@@ -73,317 +73,10 @@ The main class of the component is
7373

7474
var_dump($expressionLanguage->compile('1 + 2')); // displays (1 + 2)
7575

76-
.. _expression-language-syntax:
77-
78-
.. index::
79-
single: Syntax; ExpressionLanguage
80-
81-
Expression Syntax
82-
-----------------
83-
84-
The ExpressionLanguage component uses a specific syntax which is based on the
85-
expression syntax of Twig. In this document, you can find all supported
86-
syntaxes.
87-
88-
Supported Literals
89-
~~~~~~~~~~~~~~~~~~
90-
91-
The component supports:
92-
93-
* **strings** - single and double quotes (e.g. ``'hello'``)
94-
* **numbers** - e.g. ``103``
95-
* **arrays** - using JSON-like notation (e.g. ``[1, 2]``)
96-
* **hashes** - using JSON-like notation (e.g. ``{ foo: 'bar' }``)
97-
* **booleans** - ``true`` and ``false``
98-
* **null** - ``null``
99-
* **exponential** - also known as scientific (e.g. ``1.99E+3`` or ``1e-2``)
100-
101-
.. caution::
102-
103-
A backslash (``\``) must be escaped by 4 backslashes (``\\\\``) in a string
104-
and 8 backslashes (``\\\\\\\\``) in a regex::
105-
106-
echo $expressionLanguage->evaluate('"\\\\"'); // prints \
107-
$expressionLanguage->evaluate('"a\\\\b" matches "/^a\\\\\\\\b$/"'); // returns true
108-
109-
Control characters (e.g. ``\n``) in expressions are replaced with
110-
whitespace. To avoid this, escape the sequence with a single backslash
111-
(e.g. ``\\n``).
112-
113-
.. _component-expression-objects:
114-
115-
Working with Objects
116-
~~~~~~~~~~~~~~~~~~~~
117-
118-
When passing objects into an expression, you can use different syntaxes to
119-
access properties and call methods on the object.
120-
121-
Accessing Public Properties
122-
...........................
123-
124-
Public properties on objects can be accessed by using the ``.`` syntax, similar
125-
to JavaScript::
126-
127-
class Apple
128-
{
129-
public $variety;
130-
}
131-
132-
$apple = new Apple();
133-
$apple->variety = 'Honeycrisp';
134-
135-
var_dump($expressionLanguage->evaluate(
136-
'fruit.variety',
137-
[
138-
'fruit' => $apple,
139-
]
140-
));
141-
142-
This will print out ``Honeycrisp``.
143-
144-
Calling Methods
145-
...............
146-
147-
The ``.`` syntax can also be used to call methods on an object, similar to
148-
JavaScript::
149-
150-
class Robot
151-
{
152-
public function sayHi($times)
153-
{
154-
$greetings = [];
155-
for ($i = 0; $i < $times; $i++) {
156-
$greetings[] = 'Hi';
157-
}
158-
159-
return implode(' ', $greetings).'!';
160-
}
161-
}
162-
163-
$robot = new Robot();
164-
165-
var_dump($expressionLanguage->evaluate(
166-
'robot.sayHi(3)',
167-
[
168-
'robot' => $robot,
169-
]
170-
));
171-
172-
This will print out ``Hi Hi Hi!``.
173-
174-
.. _component-expression-functions:
175-
176-
Working with Functions
177-
~~~~~~~~~~~~~~~~~~~~~~
178-
179-
You can also use registered functions in the expression by using the same
180-
syntax as PHP and JavaScript. The ExpressionLanguage component comes with one
181-
function by default: ``constant()``, which will return the value of the PHP
182-
constant::
183-
184-
define('DB_USER', 'root');
185-
186-
var_dump($expressionLanguage->evaluate(
187-
'constant("DB_USER")'
188-
));
189-
190-
This will print out ``root``.
191-
192-
.. tip::
193-
194-
To read how to register your own functions to use in an expression, see
195-
":ref:`expression-language-extending`".
196-
197-
.. _component-expression-arrays:
198-
199-
Working with Arrays
200-
~~~~~~~~~~~~~~~~~~~
201-
202-
If you pass an array into an expression, use the ``[]`` syntax to access
203-
array keys, similar to JavaScript::
204-
205-
$data = ['life' => 10, 'universe' => 10, 'everything' => 22];
206-
207-
var_dump($expressionLanguage->evaluate(
208-
'data["life"] + data["universe"] + data["everything"]',
209-
[
210-
'data' => $data,
211-
]
212-
));
213-
214-
This will print out ``42``.
215-
216-
Supported Operators
217-
~~~~~~~~~~~~~~~~~~~
218-
219-
The component comes with a lot of operators:
220-
221-
Arithmetic Operators
222-
....................
223-
224-
* ``+`` (addition)
225-
* ``-`` (subtraction)
226-
* ``*`` (multiplication)
227-
* ``/`` (division)
228-
* ``%`` (modulus)
229-
* ``**`` (pow)
230-
231-
For example::
232-
233-
var_dump($expressionLanguage->evaluate(
234-
'life + universe + everything',
235-
[
236-
'life' => 10,
237-
'universe' => 10,
238-
'everything' => 22,
239-
]
240-
));
241-
242-
This will print out ``42``.
243-
244-
Bitwise Operators
245-
.................
246-
247-
* ``&`` (and)
248-
* ``|`` (or)
249-
* ``^`` (xor)
250-
251-
Comparison Operators
252-
....................
253-
254-
* ``==`` (equal)
255-
* ``===`` (identical)
256-
* ``!=`` (not equal)
257-
* ``!==`` (not identical)
258-
* ``<`` (less than)
259-
* ``>`` (greater than)
260-
* ``<=`` (less than or equal to)
261-
* ``>=`` (greater than or equal to)
262-
* ``matches`` (regex match)
263-
26476
.. tip::
26577

266-
To test if a string does *not* match a regex, use the logical ``not``
267-
operator in combination with the ``matches`` operator::
268-
269-
$expressionLanguage->evaluate('not ("foo" matches "/bar/")'); // returns true
270-
271-
You must use parentheses because the unary operator ``not`` has precedence
272-
over the binary operator ``matches``.
273-
274-
Examples::
275-
276-
$ret1 = $expressionLanguage->evaluate(
277-
'life == everything',
278-
[
279-
'life' => 10,
280-
'everything' => 22,
281-
]
282-
);
283-
284-
$ret2 = $expressionLanguage->evaluate(
285-
'life > everything',
286-
[
287-
'life' => 10,
288-
'everything' => 22,
289-
]
290-
);
291-
292-
Both variables would be set to ``false``.
293-
294-
Logical Operators
295-
.................
296-
297-
* ``not`` or ``!``
298-
* ``and`` or ``&&``
299-
* ``or`` or ``||``
300-
301-
For example::
302-
303-
$ret = $expressionLanguage->evaluate(
304-
'life < universe or life < everything',
305-
[
306-
'life' => 10,
307-
'universe' => 10,
308-
'everything' => 22,
309-
]
310-
);
311-
312-
This ``$ret`` variable will be set to ``true``.
313-
314-
String Operators
315-
................
316-
317-
* ``~`` (concatenation)
318-
319-
For example::
320-
321-
var_dump($expressionLanguage->evaluate(
322-
'firstName~" "~lastName',
323-
[
324-
'firstName' => 'Arthur',
325-
'lastName' => 'Dent',
326-
]
327-
));
328-
329-
This would print out ``Arthur Dent``.
330-
331-
Array Operators
332-
...............
333-
334-
* ``in`` (contain)
335-
* ``not in`` (does not contain)
336-
337-
For example::
338-
339-
class User
340-
{
341-
public $group;
342-
}
343-
344-
$user = new User();
345-
$user->group = 'human_resources';
346-
347-
$inGroup = $expressionLanguage->evaluate(
348-
'user.group in ["human_resources", "marketing"]',
349-
[
350-
'user' => $user,
351-
]
352-
);
353-
354-
The ``$inGroup`` would evaluate to ``true``.
355-
356-
Numeric Operators
357-
.................
358-
359-
* ``..`` (range)
360-
361-
For example::
362-
363-
class User
364-
{
365-
public $age;
366-
}
367-
368-
$user = new User();
369-
$user->age = 34;
370-
371-
$expressionLanguage->evaluate(
372-
'user.age in 18..45',
373-
[
374-
'user' => $user,
375-
]
376-
);
377-
378-
This will evaluate to ``true``, because ``user.age`` is in the range from
379-
``18`` to ``45``.
380-
381-
Ternary Operators
382-
.................
383-
384-
* ``foo ? 'yes' : 'no'``
385-
* ``foo ?: 'no'`` (equal to ``foo ? foo : 'no'``)
386-
* ``foo ? 'yes'`` (equal to ``foo ? 'yes' : ''``)
78+
See :doc:`/reference/formats/expression_language` to learn the syntax of
79+
the ExpressionLanguage component.
38780

38881
Passing in Variables
38982
--------------------
@@ -428,6 +121,8 @@ expressions (e.g. the request, the current user, etc.):
428121
.. index::
429122
single: Caching; ExpressionLanguage
430123

124+
.. _expression-language-caching:
125+
431126
Caching
432127
-------
433128

@@ -498,6 +193,8 @@ Both ``evaluate()`` and ``compile()`` can handle ``ParsedExpression`` and
498193
single: AST; ExpressionLanguage
499194
single: AST; Abstract Syntax Tree
500195

196+
.. _expression-language-ast:
197+
501198
AST Dumping and Editing
502199
-----------------------
503200

0 commit comments

Comments
 (0)