These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | <?php |
||
2 | |||
3 | namespace Soluto\Settings; |
||
4 | |||
5 | use Yii; |
||
6 | use yii\base\Component; |
||
7 | use yii\db\Connection; |
||
8 | use yii\db\Query; |
||
9 | |||
10 | class Settings extends Component |
||
11 | { |
||
12 | /** |
||
13 | * @event SettingsEvent an event that is triggered before execute command. |
||
14 | */ |
||
15 | const EVENT_BEFORE_EXECUTE = 'beforeExecute'; |
||
16 | |||
17 | /** |
||
18 | * @var string Name of the table where configurations will be stored |
||
19 | */ |
||
20 | public $tableName = '{{%settings}}'; |
||
21 | |||
22 | /** |
||
23 | * @var string Name of column where keys will be stored |
||
24 | */ |
||
25 | public $keyColumnName = 'key'; |
||
26 | |||
27 | /** |
||
28 | * @var string Name of column where values will be stored |
||
29 | */ |
||
30 | public $valueColumnName = 'value'; |
||
31 | |||
32 | /** |
||
33 | * @return Connection the DB connection instance |
||
34 | */ |
||
35 | 2 | protected function getDb() |
|
36 | { |
||
37 | 2 | return Yii::$app->getDb(); |
|
38 | } |
||
39 | |||
40 | /** |
||
41 | * Whether the configuration exists in the database |
||
42 | * @param string $name configuration name |
||
43 | * @param integer $tenantId The tenant id value |
||
44 | * @return bool |
||
45 | */ |
||
46 | 2 | protected function exists($name) |
|
47 | { |
||
48 | 2 | $query = $this->createQuery($name); |
|
49 | 2 | return $query->exists(); |
|
50 | } |
||
51 | |||
52 | /** |
||
53 | * Returns configuration value from database |
||
54 | * @param string $name configuration name |
||
55 | * @return string value stored in database |
||
56 | */ |
||
57 | 1 | public function get($name, $defaultValue = null) |
|
58 | { |
||
59 | 1 | $value = null; |
|
60 | 1 | $query = $this->createQuery($name); |
|
61 | 1 | $row = $query->one($this->getDb()); |
|
62 | |||
63 | 1 | $value = ($row) ? $row[$this->valueColumnName] : null; |
|
64 | |||
65 | 1 | if (is_string($value) && trim($value) == '') { |
|
66 | $value = null; |
||
67 | } |
||
68 | |||
69 | 1 | return ($value !== null) ? $value : $defaultValue; |
|
70 | } |
||
71 | |||
72 | /** |
||
73 | * Store configuration value to database |
||
74 | * @param string $name |
||
75 | * @param mixed $value |
||
76 | */ |
||
77 | 2 | public function set($name, $value) |
|
78 | { |
||
79 | 2 | $db = $this->getDb(); |
|
80 | |||
81 | 2 | $event = new SettingsEvent(); |
|
82 | 2 | $this->trigger(self::EVENT_BEFORE_EXECUTE, $event); |
|
83 | |||
84 | 2 | $columns = array_merge($event->columns, [$this->valueColumnName => $value]); |
|
85 | 2 | $where = array_merge($event->columns, [$this->keyColumnName => $name]); |
|
86 | |||
87 | 2 | if ($this->exists($name)) { |
|
88 | 1 | $db->createCommand() |
|
89 | 1 | ->update($this->tableName, $columns, $where) |
|
90 | 1 | ->execute(); |
|
91 | 1 | } else { |
|
92 | 2 | $values = array_merge([$this->keyColumnName => $name], $columns); |
|
93 | |||
94 | 2 | $db->createCommand() |
|
95 | 2 | ->insert($this->tableName, $values) |
|
96 | 2 | ->execute(); |
|
97 | } |
||
98 | 2 | } |
|
99 | |||
100 | /** |
||
101 | * Retrieves all configurations stored in database |
||
102 | * @param integer $tenantId |
||
103 | * @return array |
||
104 | */ |
||
105 | 1 | public function all() |
|
106 | { |
||
107 | 1 | $result = []; |
|
108 | |||
109 | 1 | $query = $this->createQuery() |
|
110 | 1 | ->addSelect($this->keyColumnName); |
|
111 | |||
112 | 1 | $rows = $query->all($this->getDb()); |
|
113 | |||
114 | 1 | foreach ($rows as $row) { |
|
115 | 1 | $result[$row[$this->keyColumnName]] = $row[$this->valueColumnName]; |
|
116 | 1 | } |
|
117 | |||
118 | 1 | return $result; |
|
119 | } |
||
120 | |||
121 | /** |
||
122 | * Store all configuration in database |
||
123 | * @param array $names |
||
124 | */ |
||
125 | 1 | public function save($names) |
|
126 | { |
||
127 | 1 | foreach ($names as $key => $value) { |
|
128 | 1 | $this->set($key, $value) ; |
|
129 | 1 | } |
|
130 | 1 | } |
|
131 | |||
132 | /** |
||
133 | * Deletes specified configurations (or all if none specified) from the parameters table |
||
134 | * @param array|string $names |
||
135 | * @param integer $tenantId |
||
136 | */ |
||
137 | 1 | public function delete($names = []) |
|
138 | { |
||
139 | 1 | if (is_array($names)) { |
|
140 | 1 | $where = ['IN', $this->keyColumnName, $names]; |
|
141 | 1 | } else { |
|
142 | 1 | $where = [$this->keyColumnName => $names]; |
|
143 | } |
||
144 | |||
145 | 1 | $event = new SettingsEvent(); |
|
146 | 1 | $this->trigger(self::EVENT_BEFORE_EXECUTE, $event); |
|
147 | |||
148 | 1 | if ($event->columns) { |
|
0 ignored issues
–
show
|
|||
149 | $where = array_merge($event->columns, $where); |
||
150 | } |
||
151 | |||
152 | 1 | $this->getDb() |
|
153 | 1 | ->createCommand() |
|
154 | 1 | ->delete($this->tableName, $where) |
|
155 | 1 | ->execute(); |
|
156 | 1 | } |
|
157 | |||
158 | /** |
||
159 | * Creates query to find settings value |
||
160 | * @param string $name |
||
161 | * @return \yii\db\Query |
||
162 | */ |
||
163 | 2 | protected function createQuery($name = null) |
|
164 | { |
||
165 | 2 | $query = (new Query()) |
|
166 | 2 | ->select([$this->valueColumnName]) |
|
167 | 2 | ->from($this->tableName); |
|
168 | |||
169 | 2 | $event = new SettingsEvent(); |
|
170 | 2 | $this->trigger(self::EVENT_BEFORE_EXECUTE, $event); |
|
171 | |||
172 | 2 | if ($event->columns) { |
|
0 ignored issues
–
show
The expression
$event->columns of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.
This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent. Consider making the comparison explicit by using
Loading history...
|
|||
173 | 1 | $query->andWhere($event->columns); |
|
174 | 1 | } |
|
175 | |||
176 | 2 | if ($name) { |
|
177 | 2 | $query->andWhere([$this->keyColumnName => $name]); |
|
178 | 2 | } |
|
179 | |||
180 | 2 | return $query; |
|
181 | } |
||
182 | |||
183 | } |
||
184 |
This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.
Consider making the comparison explicit by using
empty(..)
or! empty(...)
instead.