This document provides an overview of the Twig templating engine. It begins with introducing Twig and its advantages over traditional PHP templates. It then covers basic Twig syntax like variables, control structures, filters, tests, and extensions. The document explains how to extend templates through inheritance, includes, and macros. It also discusses creating custom Twig extensions and tags. Finally, it notes that Twig compiles templates to optimized PHP code for speed and has a sandbox mode for security when evaluating untrusted templates.
4. Why we are here?
To remember (or learn) the basics of Twig
Recall Twig main features and advantages
Find out extending possibilities
Debug Twig core a little bit
7. Functions
Tests
Filters
From Functions to
Filters and Tests
Functions in Twig works the same as
in PHP – they apply arguments in
parentheses and return result.
Filters are modifying the
value by some rules.
Value Filter Params
Tests are checking
the value by test rule.
Value Test Paramsis
Test sign
Filter sign
8. Extending templates
Layout
block header
block footer
Blocksidebar
block content
Module template
Blocksidebar
extends
Your template
block content
Block definitions in child
templates replace its content
in parent template
You have to define only
that blocks that you
want to overwrite
You can overwrite
any block from
parent template
extends
Replaces per block
9. Re-usage of templates
Your template
Parent
template
Layout
Parent
template
{% extends … %}
Replaces per block
Block
definitions
{% use … %}
Peace of
template
{% include … %}
Macro
(Peace of template
with arguments)
{% import … %}
{% embed … %}
10. Creating Twig extension
class MyExtension extends Twig_Extension
{
public function getFilters()
{
return array(
new Twig_SimpleFilter(„my_filter', „callback'),
);
}
}
$twig->addExtension(new MyExtension());
Custom extension allows to define:
•Globals
•Functions
•Filters
•Tags
•Tests
•Operators
11. Extending Twig for Jedi
Make a
service
global for
twig
Create a macro
when need to
reuse template
with parameters
Forgot to calculate some
stuff before rendering
template?
- Go to the dark side,
make your service global
Want to define some logic
in declarative way?
- Do not restrain your
emotions, make a macro
For strong minds the only
way is to write custom
tag, in custom bundle and
publish it on GitHub
Twig
Extension
Also you could create a
Twig extension to define
your functions, filters,
tests and operators. And
share the extension
between projects
Custom
tag
12. How it works?
Data from
controller
Lexer
Parser
Compiler
Caching
system
Web page
Hello word!
index.html.twig Evaluate
Lexer splits input
text into language
primitives in one
stream
Parser builds node tree
according to nesting rules
(Abstract Syntax Tree)
Compiler generates
PHP code based on
Abstract syntax Tree
Each template is
represented as a PHP class
in the caching system
First time Twig has to
parse input file and
build cache entry
13. Lexer
1 Hello.
2 {{.name|capitalize.}}
3
For example there is a file index.html.twig
Lexer understands language primitives and
outputs them in one stream
Lexer
Hm.. There is some text.
TEXT_TYPE(“Hello n”)
Hm.. Seems this is start of tag
VAR_START_TYPE()
TEXT_TYPE(“Hello n”),
VAR_START_TYPE(),
NAME_TYPE(“name”),
OPERATOR_TYPE(“|”),
NAME_TYPE(“capitalize”),
VAR_END_TYPE(),
EOF_TYPE()
Now I see a variable
NAME_TYPE(“name”)
Hm.. Some operator
OPERATOR_TYPE(“|”)
Wow! Again some name
NAME_TYPE(“capitalize”)
15. Compiler
Template: index.html.twig
Text: “Hello n”
Echo result of calculation
Filter: capitalize
Value of variable
“name”
Compiler is a tool that converts Abstract Syntax Tree into a PHP code. For each
type of node compiler has own handlers. Each handler knows how to transform
node of AST into raw PHP string. So, at the output we have PHP code in one
stream.
Compiler
echo “Hello n”;
echo ucfirst($name);
This code will be put
into PHP representation
of index.html.twig
16. The power of customization
Lexer
Goals Solutions
As a PHP lover
I want to support <?: ?> tags
so that it makes me happy
As an idealist
I need {% single %} case in “for” tag
So that it controls case when there
is only one element in input data
As a “hot fixer”
I want to have {% log %} tag
so that I can save data
between tags into log file
Parser
Compiler
Create a node class that
implements Twig_NodeInterface.
Define custom logic in compile()
method. You also need to create
custom TokenParser to initialize
new node class.
Create a Token Parser class that
implements
Twig_TokenParserInterface.
Define you logic in parse()
method. Use existing compilers
for all cases.
Change default Twig lexer with
custom one that extends from
core and understands new tags
as {{ and }}
17. Sandbox – include untrusted templates
Secure template
include
Users can edit templates online ?
They can do something
you wouldn’t like
Let’s filter
user’s input by
white-list rules!
In sandboxed template you can use
only allowed:
•Methods of your classes,
•Properties of your classes
•Filters
•Tags
18. Find your reason to love Twig
Twig is a modern template engine for PHP
Fast: Twig compiles templates down to plain optimized PHP
code. The overhead compared to regular PHP code was reduced to
the very minimum.
Secure: Twig has a sandbox mode to evaluate untrusted
template code. This allows Twig to be used as a template language
for applications where users may modify the template design.
Flexible: Twig is powered by a flexible lexer and parser. This
allows the developer to define its own custom tags and filters, and
create its own DSL.