ViewRenderer::init()   D
last analyzed

Complexity

Conditions 10
Paths 20

Size

Total Lines 27
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 27
rs 4.8196
c 0
b 0
f 0
cc 10
eloc 14
nc 20
nop 0

How to fix   Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
/**
3
 * View.php
4
 */
5
6
namespace drdim\yii\pug;
7
8
use Pug\Pug;
9
use Yii;
10
use yii\base\View;
11
use yii\helpers\FileHelper;
12
13
/**
14
 * Class ViewRenderer
15
 * @package drdim\yii\pug
16
 */
17
class ViewRenderer extends \yii\base\ViewRenderer
18
{
19
20
    /**
21
     * @var string the directory or path alias pointing to where Pug cache will be stored. Set to false to disable
22
     * templates cache.
23
     */
24
    public $cachePath = '@runtime/pug/cache';
25
    /**
26
     * @var array Pug options.
27
     * @see https://github.com/pug-php/pug
28
     */
29
    public $options = [
30
        'pretty' => true,
31
        'extension' => '.pug',
32
        'upToDateCheck' => true,
33
        'debug' => false,
34
        'expressionLanguage' => 'php',
35
    ];
36
    /**
37
     * @var array Custom filters.
38
     * Keys of the array are names to call in template, values are names of functions or static methods of some class.
39
     * Example: `['rot13' => 'str_rot13', 'jsonEncode' => '\yii\helpers\Json::encode']`.
40
     * In the template you can use it like this: `{{ 'test'|rot13 }}` or `{{ model|jsonEncode }}`.
41
     */
42
    public $filters = [];
43
    /**
44
     * @var Pug pug environment object that renders pug templates
45
     */
46
    public $pug;
47
48
    public function init()
49
    {
50
        $cachePath = empty($this->cachePath) ? false : Yii::getAlias($this->cachePath);
51
52
        if (!empty($cachePath) && !file_exists($cachePath)) {
53
            FileHelper::createDirectory($cachePath);
0 ignored issues
show
Bug introduced by
It seems like $cachePath defined by empty($this->cachePath) ...Alias($this->cachePath) on line 50 can also be of type boolean; however, yii\helpers\BaseFileHelper::createDirectory() does only seem to accept string, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
54
        }
55
56
        if (!empty($cachePath) && !is_readable($cachePath)) {
57
            throw new Exception(\Yii::t('app', 'Pug cache path is not readable.'));
58
        }
59
60
        if (!empty($cachePath) && !is_writeable($cachePath)) {
61
            throw new Exception(\Yii::t('app', 'Pug cache path is not writable.'));
62
        }
63
64
        $this->pug = new Pug(array_merge([
65
            'cache' => $cachePath,
66
        ], $this->options));
67
68
        // Adding custom filters
69
        if (!empty($this->filters)) {
70
            foreach ($this->filters as $name => $handler) {
71
                $this->addFilter($name, $handler);
72
            }
73
        }
74
    }
75
76
    /**
77
     * Renders a view file.
78
     *
79
     * This method is invoked by [[View]] whenever it tries to render a view.
80
     * Child classes must implement this method to render the given view file.
81
     *
82
     * @param View $view the view object used for rendering the file.
83
     * @param string $file the view file.
84
     * @param array $params the parameters to be passed to the view file.
85
     *
86
     * @return string the rendering result
87
     */
88
    public function render($view, $file, $params)
89
    {
90
        return $this->pug->render($file, ['view' => $view] + $params);
91
    }
92
93
    /**
94
     * Adds custom filter
95
     * @param string $name
96
     * @param callable $handler
97
     */
98
    public function addFilter($name, $handler)
99
    {
100
        $this->pug->filter($name, $handler);
101
    }
102
}
103