Completed
Push — master ( 97569c...236d2a )
by Philip
06:56
created

YamlReader::getCacheFile()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
dl 0
loc 3
rs 10
c 1
b 0
f 1
cc 1
eloc 2
nc 1
nop 1
1
<?php
2
3
/*
4
 * This file is part of the CRUDlex package.
5
 *
6
 * (c) Philip Lehmann-Böhm <[email protected]>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace CRUDlex;
13
14
use Symfony\Component\Yaml\Yaml;
15
16
/**
17
 * Reads Yaml files and caches them if a writable path is given. The cache is used first on the next read.
18
 * It is a simple PHP class internally.
19
 */
20
class YamlReader {
21
22
    /**
23
     * The path for the cache files.
24
     */
25
    protected $cachePath;
26
27
    /**
28
     * Gets an absolute path for a cache file.
29
     *
30
     * @param string $fileName
31
     * the file to cache
32
     * @return string
33
     * the absolute path of the cache file
34
     */
35
    protected function getCacheFile($fileName) {
36
        return $this->cachePath.'/'.basename($fileName).'CRUDlexCache.php';
37
    }
38
39
    /**
40
     * Reads the content of the cached file if it exists.
41
     *
42
     * @param string $fileName
43
     * the cache file to read from
44
     * @return null|array
45
     * the cached data structure or null if the cache file was not available
46
     */
47
    protected function readFromCache($fileName) {
48
        $cacheFile = $this->getCacheFile($fileName);
49
        if (file_exists($cacheFile) && is_readable($cacheFile)) {
50
            include($cacheFile);
51
            if (isset($crudlexCacheContent)) {
1 ignored issue
show
Bug introduced by
The variable $crudlexCacheContent seems to never exist, and therefore isset should always return false. Did you maybe rename this variable?

This check looks for calls to isset(...) or empty() on variables that are yet undefined. These calls will always produce the same result and can be removed.

This is most likely caused by the renaming of a variable or the removal of a function/method parameter.

Loading history...
52
                return $crudlexCacheContent;
53
            }
54
        }
55
        return null;
56
    }
57
58
    /**
59
     * Writes the given content to a cached PHP file.
60
     *
61
     * @param string $fileName
62
     * the original filename
63
     * @param array $content
64
     * the content to cache
65
     */
66
    protected function writeToCache($fileName, $content) {
67
        if ($this->cachePath === null || !is_dir($this->cachePath) || !is_writable($this->cachePath)) {
68
            return;
69
        }
70
        $encoder    = new \Riimu\Kit\PHPEncoder\PHPEncoder();
71
        $contentPHP = $encoder->encode($content, [
72
            'whitespace' => false,
73
            'recursion.detect' => false
74
        ]);
75
        $cache = '<?php $crudlexCacheContent = '.$contentPHP.';';
0 ignored issues
show
Coding Style introduced by
Equals sign not aligned with surrounding assignments; expected 6 spaces but found 1 space

This check looks for multiple assignments in successive lines of code. It will report an issue if the operators are not in a straight line.

To visualize

$a = "a";
$ab = "ab";
$abc = "abc";

will produce issues in the first and second line, while this second example

$a   = "a";
$ab  = "ab";
$abc = "abc";

will produce no issues.

Loading history...
76
        file_put_contents($this->getCacheFile($fileName), $cache);
77
    }
78
79
    /**
80
     * YamlReader constructor.
81
     * @param string|null $cachePath
82
     * if given, the path for the cache files which should be a writable directory
83
     */
84
    public function __construct($cachePath) {
85
        $this->cachePath = $cachePath;
86
    }
87
88
    /**
89
     * Reads and returns the contents of the given Yaml file. If
90
     * it goes wrong, it throws an exception.
91
     *
92
     * @param string $fileName
93
     * the file to read
94
     *
95
     * @return array
96
     * the file contents
97
     *
98
     * @throws \RuntimeException
99
     * thrown if the file could not be read or parsed
100
     */
101
    public function read($fileName) {
102
103
        $parsedYaml = $this->readFromCache($fileName);
104
        if ($parsedYaml !== null) {
105
            return $parsedYaml;
106
        }
107
108
        try {
109
            $fileContent = file_get_contents($fileName);
110
            $parsedYaml  = Yaml::parse($fileContent);
111
            if (!is_array($parsedYaml)) {
112
                $parsedYaml = [];
113
            }
114
            $this->writeToCache($fileName, $parsedYaml);
115
            return $parsedYaml;
116
        } catch (\Exception $e) {
117
            throw new \RuntimeException('Could not read Yaml file '.$fileName, $e->getCode(), $e);
118
        }
119
    }
120
121
}
122