1: <?php
2: /**
3: * PhpReader file
4: *
5: * PHP 5
6: *
7: * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
8: *
9: * Licensed under The MIT License
10: * For full copyright and license information, please see the LICENSE.txt
11: * Redistributions of files must retain the above copyright notice
12: *
13: * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
14: * @link http://book.cakephp.org/2.0/en/development/configuration.html#loading-configuration-files CakePHP(tm) Configuration
15: * @package Cake.Configure
16: * @since CakePHP(tm) v 2.0
17: * @license http://www.opensource.org/licenses/mit-license.php MIT License
18: */
19:
20: /**
21: * PHP Reader allows Configure to load configuration values from
22: * files containing simple PHP arrays.
23: *
24: * Files compatible with PhpReader should define a `$config` variable, that
25: * contains all of the configuration data contained in the file.
26: *
27: * @package Cake.Configure
28: */
29: class PhpReader implements ConfigReaderInterface {
30:
31: /**
32: * The path this reader finds files on.
33: *
34: * @var string
35: */
36: protected $_path = null;
37:
38: /**
39: * Constructor for PHP Config file reading.
40: *
41: * @param string $path The path to read config files from. Defaults to APP . 'Config' . DS
42: */
43: public function __construct($path = null) {
44: if (!$path) {
45: $path = APP . 'Config' . DS;
46: }
47: $this->_path = $path;
48: }
49:
50: /**
51: * Read a config file and return its contents.
52: *
53: * Files with `.` in the name will be treated as values in plugins. Instead of reading from
54: * the initialized path, plugin keys will be located using App::pluginPath().
55: *
56: * @param string $key The identifier to read from. If the key has a . it will be treated
57: * as a plugin prefix.
58: * @return array Parsed configuration values.
59: * @throws ConfigureException when files don't exist or they don't contain `$config`.
60: * Or when files contain '..' as this could lead to abusive reads.
61: */
62: public function read($key) {
63: if (strpos($key, '..') !== false) {
64: throw new ConfigureException(__d('cake_dev', 'Cannot load configuration files with ../ in them.'));
65: }
66:
67: $file = $this->_getFilePath($key);
68: if (!is_file($file)) {
69: throw new ConfigureException(__d('cake_dev', 'Could not load configuration file: %s', $file));
70: }
71:
72: include $file;
73: if (!isset($config)) {
74: throw new ConfigureException(__d('cake_dev', 'No variable $config found in %s', $file));
75: }
76: return $config;
77: }
78:
79: /**
80: * Converts the provided $data into a string of PHP code that can
81: * be used saved into a file and loaded later.
82: *
83: * @param string $key The identifier to write to. If the key has a . it will be treated
84: * as a plugin prefix.
85: * @param array $data Data to dump.
86: * @return int Bytes saved.
87: */
88: public function dump($key, $data) {
89: $contents = '<?php' . "\n" . '$config = ' . var_export($data, true) . ';';
90:
91: $filename = $this->_getFilePath($key);
92: return file_put_contents($filename, $contents);
93: }
94:
95: /**
96: * Get file path
97: *
98: * @param string $key The identifier to write to. If the key has a . it will be treated
99: * as a plugin prefix.
100: * @return string Full file path
101: */
102: protected function _getFilePath($key) {
103: if (substr($key, -4) === '.php') {
104: $key = substr($key, 0, -4);
105: }
106: list($plugin, $key) = pluginSplit($key);
107: $key .= '.php';
108:
109: if ($plugin) {
110: $file = App::pluginPath($plugin) . 'Config' . DS . $key;
111: } else {
112: $file = $this->_path . $key;
113: }
114:
115: return $file;
116: }
117:
118: }
119: