Class yii\twig\ViewRenderer

Inheritanceyii\twig\ViewRenderer » yii\base\ViewRenderer
Available since extension's version2.0
Source Code https://github.com/yiisoft/yii2-twig/blob/master/src/ViewRenderer.php

TwigViewRenderer allows you to use Twig templates in views.

Public Properties

Hide inherited properties

Property Type Description Defined By
$cachePath string The directory or path alias pointing to where Twig cache will be stored. yii\twig\ViewRenderer
$extension yii\twig\Extension yii\twig\ViewRenderer
$extensions array Custom extensions. yii\twig\ViewRenderer
$filters array Custom filters. yii\twig\ViewRenderer
$functions array Custom functions. yii\twig\ViewRenderer
$globals array Global variables. yii\twig\ViewRenderer
$lexerOptions array Twig lexer options. yii\twig\ViewRenderer
$options array Twig options. yii\twig\ViewRenderer
$twig \Twig\Environment Twig environment object that renders twig templates yii\twig\ViewRenderer
$twigFallbackPaths array Twig fallback paths yii\twig\ViewRenderer
$twigModulesNamespace string Twig namespace to use in modules templates yii\twig\ViewRenderer
$twigViewsNamespace string Twig namespace to use in templates yii\twig\ViewRenderer
$twigWidgetsNamespace string Twig namespace to use in widgets templates yii\twig\ViewRenderer
$uses array Namespaces and classes to import. yii\twig\ViewRenderer

Protected Properties

Hide inherited properties

Property Type Description Defined By

Public Methods

Hide inherited methods

Method Description Defined By
addExtensions() Adds custom extensions yii\twig\ViewRenderer
addFilters() Adds custom filters yii\twig\ViewRenderer
addFunctions() Adds custom functions yii\twig\ViewRenderer
addGlobals() Adds global objects or static classes yii\twig\ViewRenderer
init() yii\twig\ViewRenderer
render() Renders a view file. yii\twig\ViewRenderer
setLexerOptions() Sets Twig lexer options to change templates syntax yii\twig\ViewRenderer

Protected Methods

Hide inherited methods

Method Description Defined By
addAliases() Adds aliases yii\twig\ViewRenderer
addFallbackPaths() Adds fallback paths to twig loader yii\twig\ViewRenderer

Property Details

Hide inherited properties

$cachePath public property

The directory or path alias pointing to where Twig cache will be stored. Set to false to disable templates cache.

public string $cachePath '@runtime/Twig/cache'
$extension protected property
protected yii\twig\Extension $extension null
$extensions public property

Custom extensions. Example: ['Twig_Extension_Sandbox', new \Twig_Extension_Text()]

public array $extensions = []
$filters public property

Custom filters. Keys of the array are names to call in template, values are names of functions or static methods of some class. Example: ['rot13' => 'str_rot13', 'jsonEncode' => '\yii\helpers\Json::encode']. In the template you can use it like this: {{ 'test'|rot13 }} or {{ model|jsonEncode }}.

public array $filters = []
$functions public property

Custom functions. Keys of the array are names to call in template, values are names of functions or static methods of some class. Example: ['rot13' => 'str_rot13', 'a' => '\yii\helpers\Html::a']. In the template you can use it like this: {{ rot13('test') }} or {{ a('Login', 'site/login') | raw }}.

public array $functions = []
$globals public property

Global variables. Keys of the array are names to call in template, values are scalar or objects or names of static classes. Example: ['html' => ['class' => '\yii\helpers\Html'], 'debug' => YII_DEBUG]. In the template you can use it like this: {{ html.a('Login', 'site/login') | raw }}.

public array $globals = []
$lexerOptions public property

Twig lexer options.

Example: Smarty-like syntax: `php [

'tag_comment'  => ['{*', '*}'],
'tag_block'    => ['{', '}'],
'tag_variable' => ['{$', '}']

] `

See also https://twig.symfony.com/doc/recipes.html#customizing-the-syntax.

public array $lexerOptions = []
$options public property
public array $options = []
$twig public property

Twig environment object that renders twig templates

public \Twig\Environment $twig null
$twigFallbackPaths public property (available since version 2.0.5)

Twig fallback paths

$twigModulesNamespace public property (available since version 2.0.5)

Twig namespace to use in modules templates

public string $twigModulesNamespace 'modules'
$twigViewsNamespace public property (available since version 2.0.5)

Twig namespace to use in templates

public string $twigViewsNamespace = \Twig\Loader\FilesystemLoader::MAIN_NAMESPACE
$twigWidgetsNamespace public property (available since version 2.0.5)

Twig namespace to use in widgets templates

public string $twigWidgetsNamespace 'widgets'
$uses public property

Namespaces and classes to import.

Example:

[
    'yii\bootstrap',
    'app\assets',
    \yii\bootstrap\NavBar::class,
]
public array $uses = []

Method Details

Hide inherited methods

addAliases() protected method

Adds aliases

protected void addAliases ( $loader, $aliases )
$loader \Twig\Loader\FilesystemLoader
$aliases array

                protected function addAliases($loader, $aliases)
{
    foreach ($aliases as $alias => $path) {
        if (is_array($path)) {
            $this->addAliases($loader, $path);
        } elseif (is_string($path) && is_dir($path)) {
            $loader->addPath($path, substr($alias, 1));
        }
    }
}

            
addExtensions() public method

Adds custom extensions

public void addExtensions ( $extensions )
$extensions array

@see self::$extensions

                public function addExtensions($extensions)
{
    foreach ($extensions as $extName) {
        $this->twig->addExtension(is_object($extName) ? $extName : Yii::createObject($extName));
    }
}

            
addFallbackPaths() protected method (available since version 2.0.5)

Adds fallback paths to twig loader

protected void addFallbackPaths ( $loader, $theme )
$loader \Twig\Loader\FilesystemLoader
$theme \yii\twig\yii\base\Theme|null

                protected function addFallbackPaths($loader, $theme)
{
    foreach ($this->twigFallbackPaths as $namespace => $path) {
        $path = Yii::getAlias($path);
        if (!is_dir($path)) {
            continue;
        }
        if (is_string($namespace)) {
            $loader->addPath($path, $namespace);
        } else {
            $loader->addPath($path);
        }
    }
    if ($theme instanceOf \yii\base\Theme && is_array($theme->pathMap)) {
        $pathMap = $theme->pathMap;
        if (isset($pathMap['@app/views'])) {
            foreach ((array)$pathMap['@app/views'] as $path) {
                $path = Yii::getAlias($path);
                if (is_dir($path)) {
                    $loader->addPath($path, $this->twigViewsNamespace);
                }
            }
        }
        if (isset($pathMap['@app/modules'])) {
            foreach ((array)$pathMap['@app/modules'] as $path) {
                $path = Yii::getAlias($path);
                if (is_dir($path)) {
                    $loader->addPath($path, $this->twigModulesNamespace);
                }
            }
        }
        if (isset($pathMap['@app/widgets'])) {
            foreach ((array)$pathMap['@app/widgets'] as $path) {
                $path = Yii::getAlias($path);
                if (is_dir($path)) {
                    $loader->addPath($path, $this->twigWidgetsNamespace);
                }
            }
        }
    }
    $defaultViewsPath = Yii::getAlias('@app/views');
    if (is_dir($defaultViewsPath)) {
        $loader->addPath($defaultViewsPath, $this->twigViewsNamespace);
    }
    $defaultModulesPath = Yii::getAlias('@app/modules');
    if (is_dir($defaultModulesPath)) {
        $loader->addPath($defaultModulesPath, $this->twigModulesNamespace);
    }
    $defaultWidgetsPath = Yii::getAlias('@app/widgets');
    if (is_dir($defaultWidgetsPath)) {
        $loader->addPath($defaultWidgetsPath, $this->twigWidgetsNamespace);
    }
}

            
addFilters() public method

Adds custom filters

public void addFilters ( $filters )
$filters array

@see self::$filters

                public function addFilters($filters)
{
    $this->_addCustom('Filter', $filters);
}

            
addFunctions() public method

Adds custom functions

public void addFunctions ( $functions )
$functions array

@see self::$functions

                public function addFunctions($functions)
{
    $this->_addCustom('Function', $functions);
}

            
addGlobals() public method

Adds global objects or static classes

public void addGlobals ( $globals )
$globals array

@see self::$globals

                public function addGlobals($globals)
{
    foreach ($globals as $name => $value) {
        if (is_array($value) && isset($value['class'])) {
            $value = new ViewRendererStaticClassProxy($value['class']);
        }
        $this->twig->addGlobal($name, $value);
    }
}

            
init() public method

public void init ( )

                public function init()
{
    // Create environment with empty loader
    $loader = new TwigEmptyLoader();
    $this->twig = new Environment($loader, array_merge([
        'cache' => Yii::getAlias($this->cachePath),
        'charset' => Yii::$app->charset,
        'use_yield' => false
    ], $this->options));
    // Adding custom globals (objects or static classes)
    if (!empty($this->globals)) {
        $this->addGlobals($this->globals);
    }
    // Adding custom functions
    if (!empty($this->functions)) {
        $this->addFunctions($this->functions);
    }
    // Adding custom filters
    if (!empty($this->filters)) {
        $this->addFilters($this->filters);
    }
    $this->extension = new Extension($this->uses);
    $this->addExtensions([$this->extension]);
    // Adding custom extensions
    if (!empty($this->extensions)) {
        $this->addExtensions($this->extensions);
    }
    $this->twig->addGlobal('app', \Yii::$app);
}

            
render() public method

Renders a view file.

This method is invoked by View whenever it tries to render a view. Child classes must implement this method to render the given view file.

public string render ( $view, $file, $params )
$view \yii\base\View

The view object used for rendering the file.

$file string

The view file.

$params array

The parameters to be passed to the view file.

return string

The rendering result

                public function render($view, $file, $params)
{
    $this->twig->addGlobal('this', $view);
    $loader = new FilesystemLoader(dirname($file));
    if ($view instanceof View) {
        $this->addFallbackPaths($loader, $view->theme);
    }
    $this->addAliases($loader, Yii::$aliases);
    $this->twig->setLoader($loader);
    // Change lexer syntax (must be set after other settings)
    if (!empty($this->lexerOptions)) {
        $this->setLexerOptions($this->lexerOptions);
    }
    $content = $this->twig->render(pathinfo($file, PATHINFO_BASENAME), $params);
    /**
     * Hack to work with twig3.9.
     * Explanation:
     * Twig 3.9 does not hold the contents of the template in the output buffer anymore,
     * but it still reads the contents from it (if we stick to use `use_yield` false)
     * (it was an internal implementation and this package relied on this fact)
     * This means that when the endPage method in the yii2 View class wants to read the output buffer
     * to replace the placeholders it will be empty, because twig has already emptied it (and does not hold its state anymore).
     *
     * By not doing anything in the twig function call yet (see yii\twig\Extension::viewHelper), we can work around this limitation
     * by calling the endPage function with the twig render results in the buffer after twig has already done its work.
     */
    if ($this->extension->withViewEndPage()) {
        // $view->endPage will end the current buffer when calling ob_get_clean and echo the modified(replaced placeholders) contents.
        // this means that we need 2 levels deep output buffer.
        ob_start();
        ob_start();
        echo $content;
        $view->endPage();
        $content = ob_get_clean();
    }
    return $content;
}

            
setLexerOptions() public method

Sets Twig lexer options to change templates syntax

public void setLexerOptions ( $options )
$options array

@see self::$lexerOptions

                public function setLexerOptions($options)
{
    $lexer = new Lexer($this->twig, $options);
    $this->twig->setLexer($lexer);
}