This plugin allows you to use the Twig Templating Language for your views.
It provides wrappers for common View opertions and many helpful extensions that expose CakePHP functions and jasny/twig-extensions
helpers.
To install with Composer, use the command below.
composer require cakephp/twig-view
Then, load the Cake/TwigView
plugin
in your Application
bootstrap just like other Cake plugins.
TwigView
allows you to configure the Twig Environment through View
options. You can set these through ViewBuilder
in the Controller
or set them directly in TwigView
.
// In controller
public function initialize(): void
{
$this->viewBuilder()->setOption('environment', ['cache' => false]);
}
// In your AppView
public function initialize(): void
{
$this->setConfig('environment', ['cache' => false]);
// Call parent TwigView initialize
parent::initialize();
}
-
environment
Defaults to empty.
-
markdown
Which markdown engine is used for
markdown_to_html
filter. Set todefault
to useDefaultMarkdown
or set custom Twig Markdown extensionMarkdownInterface
instance.If using
default
, require one of: -erusev/parsedown
-league/commonmark
-michelf/php-markdown
Defaults to disabled.
To start using Twig templates in your application, simply extend TwigView
in your AppView
.
In general, it is safe to add your application's setup in AppView::initialize()
.
namespace App\View;
use Cake\TwigView\View\TwigView;
class AppView extends TwigView
{
public function initialize(): void
{
parent::initialize();
// Add application-specific extensions
}
}
You can override several parts of TwigView
initialization to create a custom Twig setup.
-
File Extensions
You can specify the file extensions used to search for templates by overriding the
$extensions
property.class AppView extends TwigView { protected $extensions = [ '.custom', ]; }
-
Twig Loader
You can override the template loader used by Twig.
protected function createLoader(): \Twig\Loader\LoaderInterface { // Return a custom Twig template loader }
-
Twig Extensions
You can override the Twig Extensions loading. If you want to use the built-in
View
wrappers, make sure you loadCake\TwigView\Twig\Extensions\ViewExtension
.protected function initializeExtensions(): void { // Load only specific extensions }
-
Twig Profiler
You can override the Twig profiler used when
DebugKit
is loaded.protected function initializeProfiler(): void { parent::initializeProfiler(); // Add custom profiler logging using $this->getProfile() }
You can create views using Twig templates much like you can with standard CakePHP templates.
Templates are loaded the same way wherever they are used and follow the View
path conventions.
{% extends 'Common/base' %}
{{ include('Common/helper') }}
- Template names are always relative to
App.path.templates
not the current file. - File extensions are automatically generated. Defaults to '.twig'.
- Templates can be loaded from plugins the same as
View
templates.
Layout templates are supported and loaded the same way as View
layouts.
templates/layout/default.twig
:
<!DOCTYPE html>
<html>
<head>
<title>
{{ fetch('title') }}
</title>
{{ fetch('meta') }}
{{ fetch('css') }}
{{ fetch('script') }}
</head>
<body>
{{ fetch('content') }}
</body>
</html>
The layout can be set from the template using the layout
tag.
{% layout 'Error' %}
You can access the View
instance using the _view
global.
TwigView
provides wrappers for fetch()
, cell()
and element()
rendering.
Cell and element templates are always loaded from cell/ and element/ sub-directories
the same as View
templates.
{{ fetch('content')}}
{{ cell('myCell')}}
{{ element('myElement') }}
TwigView
also provides wrappers for any loaded helper using a special naming convention - helper_Name_function()
.
{{ helper_Text_autoParagraph('some text for a paragarph') }}
All wrapper functions are pre-escaped and do not require using |raw
filter. However, keep in mind that Twig keeps the whitespace when using {{ }}
to print. Please read the Twig documentation on how to remove the extra white space when needed.
low
maps tostrtolower
up
maps tostrtoupper
env
maps toenv
pluralize
maps toCake\Utility\Inflector::pluralize
singularize
maps toCake\Utility\Inflector::singularize
camelize
maps toCake\Utility\Inflector::camelize
underscore
maps toCake\Utility\Inflector::underscore
humanize
maps toCake\Utility\Inflector::humanize
tableize
maps toCake\Utility\Inflector::tableize
classify
maps toCake\Utility\Inflector::classify
variable
maps toCake\Utility\Inflector::variable
slug
maps toCake\Utility\Inflector::slug
toReadableSize
maps toCake\I18n\Number::toReadableSize
toPercentage
maps toCake\I18n\Number::toPercentage
cake_number_format
maps toCake\I18n\Number::format
formatDelta
maps toCake\I18n\Number::formatDelta
currency
maps toCake\I18n\Number::currency
substr
maps tosubstr
tokenize
maps toCake\Utility\Text::tokenize
insert
maps toCake\Utility\Text::insert
cleanInsert
maps toCake\Utility\Text::cleanInsert
wrap
maps toCake\Utility\Text::wrap
wrapBlock
maps toCake\Utility\Text::wrapBlock
wordWrap
maps toCake\Utility\Text::wordWrap
highlight
maps toCake\Utility\Text::highlight
tail
maps toCake\Utility\Text::tail
truncate
maps toCake\Utility\Text::truncate
excerpt
maps toCake\Utility\Text::excerpt
toList
maps toCake\Utility\Text::toList
stripLinks
maps toCake\Utility\Text::stripLinks
isMultibyte
maps toCake\Utility\Text::isMultibyte
utf8
maps toCake\Utility\Text::utf8
ascii
maps toCake\Utility\Text::ascii
parseFileSize
maps toCake\Utility\Text::parseFileSize
serialize
maps toserialize
unserialize
maps tounserialize
md5
maps tomd5
base64_encode
maps tobase64_encode
base64_decode
maps tobase64_decode
string
cast tostring
See jasny/twig-extensions
for the filters they provide.
in_array
maps toin_array
explode
maps toexplode
array
cast toarray
array_push
maps topush
array_prev
maps toprev
array_next
maps tonext
array_current
maps tocurrent
__
maps to__
__d
maps to__d
__n
maps to__n
__x
maps to__x
__dn
maps to__dn
defaultCurrency
maps toCake\I18n\Number::getDefaultCurrency
uuid
maps toCake\Utility\Text::uuid
time
passed the first and optional second argument intonew \Cake\I18n\FrozenTime()
timezones
maps toCake\I18n\FrozenTime::listTimezones
See jasny/twig-extensions
for the functions they provide.