This PR was merged into the 1.x branch.
Discussion
----------
Expose a way to access template data and methods in a portable way
`Twig_Template` is an internal class, and most of its methods are marked as being `@internal` as they are not "safe" to use by end users.
But some of its features are interesting like `renderBlock()` which is very useful when rendering emails for instance (see #1873).
This PR tries to address both issues by marking the whole `Twig_Template` class as being internal and by exposing a new way to safely interact with a template besides the obvious `render()`/`display()` methods via `$twig->load("...")`.
If also add some convenient methods like `hasBlock()` or `getBlocks()` (see ~#1831~ and #1882):
```php
$template = $twig->load('index');
echo $template->render($context);
$template->display($context);
if ($template->hasBlock('name') {
$template->displayBlock('name', $context);
}
foreach ($template->getBlocks() as $block) {
echo $template->render($block, $context);
}
```
Commits
-------
d7062f3 exposed a way to access template data and methods in a portable way
This PR was merged into the 1.x branch.
Discussion
----------
Remove optimization as it's not compatible with Symfony cache system
fixes#2243
@nicolas-grekas Instead of fixing Symfony cache system (which will only happen in a new patch release), I propose to revert these changes. It means no optimization for Twig 1.x, but the optimization is the default in Twig 2.0. So, I don't think this is a big deal.
Commits
-------
d64d320 removed optimization as it's not compatible with Symfony cache system
This PR was merged into the 1.x branch.
Discussion
----------
added support for PHP 7 null coalescing operator
fixes#1979
Commits
-------
6effc9a changed context access to use the PHP 7 null coalescing operator when available
This PR was merged into the 1.x branch.
Discussion
----------
renamed blockExists to hasBlock
As `hasBlock()` is marked as internal and because it's not even used anywhere in Twig, I've replaced its implementation with the one of `blockExists()`, and I also kept BC with a deprecation notice just in case someone is using it.
Commits
-------
59770a3 renamed blockExists to hasBlock
This PR was merged into the 1.x branch.
Discussion
----------
Add a "with" tag
Closes#719, alternative implementation of #1054
Commits
-------
4366907 added with tag
This PR was merged into the 1.x branch.
Discussion
----------
added support for a custom template on the block() function
`block()` allows one to render a block of the current template.
This PR adds the possibility to use `block()` to render a block of another template:
```twig
{{ block('footer', template_name) }}
```
As it uses the same logic as for the regular `block()`, you can also use it in a test:
```twig
{% if block('footer', template_name) is defined %}
...
{% endif %}
```
This removes the needs to use the internal `Twig_Template::renderBlock()` method in the Symfony Web Profiler for instance. And combined with #2236, it allows us to really mark the whole `Twig_Template` class as being internal.
I'm aware that #1302 asked for being able to pass a context to `block()` (implemented in #1433), but I prefer not to in favor of adding the `with` tag (see #719 and #1054).
When the `with` will be implemented, the code in the Symfony Web Profiler will become something along the lines of:
```twig
{% with {
'collector': profile.getcollector(name),
'profiler_url': profiler_url,
'token': profile.token,
'name': name
} %}
{{ block('toolbar', template) }}
{% endwith %}
```
Commits
-------
5ed59be added support for a custom template on the block() function
This PR was merged into the 1.x branch.
Discussion
----------
added 'is defined' support for constant
Commits
-------
c81bae4 added 'is defined' support for constant
This PR was merged into the 1.x branch.
Discussion
----------
Add "is defined" support for block()
replaces #1831, fixes#1821
I think reusing the semantic of the `defined` test is more idiomatic and easily discoverable.
/cc @hason
Commits
-------
3ce06af added 'is defined' support for block()
4f013e0 Add test to check if a block exists
This PR was merged into the 1.x branch.
Discussion
----------
removed old code that is not needed anymore
Commits
-------
60bed59 removed old code that is not needed anymore
This PR was merged into the 1.x branch.
Discussion
----------
added a proper error message when block() is called without arguments
Commits
-------
a63ee7c added a proper error message when block() is called without arguments
This PR was merged into the 1.x branch.
Discussion
----------
Enhance perf of Template::getAttribute()
Note that this is unproved statement for now :)
If someone has a benchmark and want to try, please do (and share results).
Commits
-------
bdbfb15 Enhance perf of Template::getAttribute()
This PR was merged into the 1.x branch.
Discussion
----------
added a note about the default escaping strategy
fixes#2061
Commits
-------
56556d7 added a note about the default escaping strategy
This PR was squashed before being merged into the 1.x branch (closes#2216).
Discussion
----------
Load templates from cache, even if they have just been compiled
Previously, when the cache was empty, the compiled template would be written to it, but `eval()`d from `$content`. In that case, it is not possible to step through (read: debug) the compiled template because at least xDebug does not have a clue where the code comes from.
With this change, PHP/xDebug can tell even on the first run (with an empty cache) where the code was loaded from.
Commits
-------
ff0abbb Load templates from cache, even if they have just been compiled
This PR was merged into the 1.x branch.
Discussion
----------
Allow construction without constructor arguments
Since we can dynamically add templates and its possible to not need to construct the loader without any initial templates. I've added the default argument to the constructor for simpler instantiation IE new Twig_Loader_Array();. This helps us on a project where we've extended the loader, and have no initial templates but need to add constructor parameters for no real reason.
Commits
-------
289f63c Allow construction without constructor arguments
This PR was merged into the 1.x branch.
Discussion
----------
add machine-readable version constants
This will make it easier to implement version depending features (see https://github.com/symfony/symfony/pull/20440#discussion_r86840491 for an example).
Commits
-------
bf07db4 add machine-readable version constants
Since we can dynamically add templates and its possible to not need to construct the loader without any initial templates. I've added the default argument to the constructor for simpler instantiation IE new Twig_Loader_Array();. This helps us on a project where we've extended the loader, and have no initial templates but need to add constructor parameters for no real reason.
This PR was merged into the 1.x branch.
Discussion
----------
Fixing wrong function name in deprecation notice
Commits
-------
0a3d3c7 Fixing wrong function name in deprecation notice