Issues (99)

Security Analysis    not enabled

This project does not seem to handle request data directly as such no vulnerable execution paths were found.

  Cross-Site Scripting
Cross-Site Scripting enables an attacker to inject code into the response of a web-request that is viewed by other users. It can for example be used to bypass access controls, or even to take over other users' accounts.
  File Exposure
File Exposure allows an attacker to gain access to local files that he should not be able to access. These files can for example include database credentials, or other configuration files.
  File Manipulation
File Manipulation enables an attacker to write custom data to files. This potentially leads to injection of arbitrary code on the server.
  Object Injection
Object Injection enables an attacker to inject an object into PHP code, and can lead to arbitrary code execution, file exposure, or file manipulation attacks.
  Code Injection
Code Injection enables an attacker to execute arbitrary code on the server.
  Response Splitting
Response Splitting can be used to send arbitrary responses.
  File Inclusion
File Inclusion enables an attacker to inject custom files into PHP's file loading mechanism, either explicitly passed to include, or for example via PHP's auto-loading mechanism.
  Command Injection
Command Injection enables an attacker to inject a shell command that is execute with the privileges of the web-server. This can be used to expose sensitive data, or gain access of your server.
  SQL Injection
SQL Injection enables an attacker to execute arbitrary SQL code on your database server gaining access to user data, or manipulating user data.
  XPath Injection
XPath Injection enables an attacker to modify the parts of XML document that are read. If that XML document is for example used for authentication, this can lead to further vulnerabilities similar to SQL Injection.
  LDAP Injection
LDAP Injection enables an attacker to inject LDAP statements potentially granting permission to run unauthorized queries, or modify content inside the LDAP tree.
  Header Injection
  Other Vulnerability
This category comprises other attack vectors such as manipulating the PHP runtime, loading custom extensions, freezing the runtime, or similar.
  Regex Injection
Regex Injection enables an attacker to execute arbitrary code in your PHP process.
  XML Injection
XML Injection enables an attacker to read files on your local filesystem including configuration files, or can be abused to freeze your web-server process.
  Variable Injection
Variable Injection enables an attacker to overwrite program variables with custom data, and can lead to further vulnerabilities.
Unfortunately, the security analysis is currently not available for your project. If you are a non-commercial open-source project, please contact support to gain access.

src/ChildishModel.php (1 issue)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
namespace Childish;
3
4
use Childish\database\DatabaseManager;
5
use Childish\database\ModelManager;
6
use Childish\support\Collection;
7
use Childish\support\Tools;
8
9
/**
10
 * ChildishModel
11
 *
12
 * @author    Pu ShaoWei <[email protected]>
13
 * @date      2017/12/7
14
 * @version   1.0
15
 */
16
abstract class ChildishModel
17
{
18
    /**
19
     * Indicates if the model should be timestamped.
20
     *
21
     * @var bool
22
     */
23
    public $timestamps = true;
24
25
    /**
26
     * The connection name for the model.
27
     *
28
     * @var string
29
     */
30
    protected $connection;
31
32
    /**
33
     * The table associated with the model.
34
     *
35
     * @var string
36
     */
37
    protected $table;
38
39
    /**
40
     * The primary key for the model.
41
     *
42
     * @var string
43
     */
44
    protected $primaryKey = 'id';
45
46
    /**
47
     * The "type" of the auto-incrementing ID.
48
     *
49
     * @var string
50
     */
51
    protected $keyType = 'int';
52
53
    /**
54
     * Indicates if the IDs are auto-incrementing.
55
     *
56
     * @var bool
57
     */
58
    public $incrementing = true;
59
60
    /**
61
     * Indicates if the model exists.
62
     *
63
     * @var bool
64
     */
65
    public $exists = false;
66
67
    /**
68
     * The model attribute's original state.
69
     *
70
     * @var array
71
     */
72
    protected $original = [];
73
74
    /**
75
     * Indicates if the model was inserted during the current request lifecycle.
76
     *
77
     * @var bool
78
     */
79
    public $wasRecentlyCreated = false;
80
81
    /**
82
     * @var  \Childish\database\DatabaseManager
83
     */
84
    protected static $resolver;
85
86
    /**
87
     * The array of booted models.
88
     *
89
     * @var array
90
     */
91
    protected static $booted = [];
92
93
    /**
94
     * The model's attributes.
95
     *
96
     * @var array
97
     */
98
    protected $attributes = [];
99
100
    /**
101
     * @var string 是否被删除
102
     */
103
    const DELETED_AT = null;
104
105
    /**
106
     * Custom update
107
     *
108
     * @var string
109
     */
110
    const DATE_FORMAT = 'Y-m-d H:i:s';
111
112
    /**
113
     * The name of the "created at" column.
114
     *
115
     * @var string
116
     */
117
    const CREATED_AT = 'created_at';
118
119
    /**
120
     * The name of the "updated at" column.
121
     *
122
     * @var string
123
     */
124
    const UPDATED_AT = 'updated_at';
125
126
127
    /**
128
     * Clear the list of booted models so they will be re-booted.
129
     *
130
     * @return void
131
     */
132
    public static function clearBootedModels()
133
    {
134
        static::$booted = [];
135
    }
136
137
    /**
138
     * Create a new instance of the given model.
139
     *
140
     * @param  array $attributes
141
     * @param  bool  $exists
142
     * @return static
143
     */
144
    public function newInstance($attributes = [], $exists = false)
145
    {
146
        $model = new static((array)$attributes);
147
148
        $model->exists = $exists;
149
150
        $model->setConnection(
151
            $this->getConnectionName()
152
        );
153
154
        return $model;
155
    }
156
157
    /**
158
     * Begin querying the model on the write connection.
159
     *
160
     * @return \Childish\query\Builder
161
     */
162
    public static function onWriteConnection()
163
    {
164
        $instance = new static;
165
166
        return $instance->newQuery()->useWritePdo();
0 ignored issues
show
Documentation Bug introduced by
The method useWritePdo does not exist on object<Childish\database\ModelManager>? Since you implemented __call, maybe consider adding a @method annotation.

If you implement __call and you know which methods are available, you can improve IDE auto-completion and static analysis by adding a @method annotation to the class.

This is often the case, when __call is implemented by a parent class and only the child class knows which methods exist:

class ParentClass {
    private $data = array();

    public function __call($method, array $args) {
        if (0 === strpos($method, 'get')) {
            return $this->data[strtolower(substr($method, 3))];
        }

        throw new \LogicException(sprintf('Unsupported method: %s', $method));
    }
}

/**
 * If this class knows which fields exist, you can specify the methods here:
 *
 * @method string getName()
 */
class SomeClass extends ParentClass { }
Loading history...
167
    }
168
169
    /**
170
     * Get all of the models from the database.
171
     *
172
     * @param  array|mixed $columns
173
     * @return \Childish\support\Collection|static[]
174
     */
175
    public static function all($columns = ['*'])
176
    {
177
        return self::query()->get(
178
            is_array($columns) ? $columns : func_get_args()
179
        );
180
    }
181
182
    /**
183
     * Set the value of the "updated at" attribute.
184
     *
185
     * @param  mixed $value
186
     * @return $this
187
     */
188
    public function setUpdatedAt($value)
189
    {
190
        $this->{static::UPDATED_AT} = $value;
191
192
        return $this;
193
    }
194
195
    /**
196
     * Set the value of the "created at" attribute.
197
     *
198
     * @param  mixed $value
199
     * @return $this
200
     */
201
    public function setCreatedAt($value)
202
    {
203
        $this->{static::CREATED_AT} = $value;
204
205
        return $this;
206
    }
207
208
209
    /**
210
     * Begin querying the model.
211
     *
212
     * @return \Childish\query\Builder
213
     */
214
    public static function query()
215
    {
216
        return (new static)->newQuery();
217
    }
218
219
    /**
220
     * getConnection
221
     *
222
     * @static
223
     * @return mixed
224
     */
225
    public static function getTableConnection()
226
    {
227
        return (new static())->getConnection();
228
    }
229
230
    /**
231
     * Get a new query builder for the model's table.
232
     *
233
     * @return \Childish\database\ModelManager
234
     */
235
    public function newQuery()
236
    {
237
        $builder = new ModelManager($this->newBaseQueryBuilder());
238
        return $builder->setModel($this);
239
    }
240
241
    /**
242
     * Get a new query builder instance for the connection.
243
     *
244
     * @return \Childish\query\Builder
245
     */
246
    protected function newBaseQueryBuilder()
247
    {
248
        return $this->getConnection()->table($this->getTable());
249
    }
250
251
    /**
252
     * Create a new Eloquent Collection instance.
253
     *
254
     * @param  array $models
255
     * @return \Childish\support\Collection
256
     */
257
    public function newCollection(array $models = [])
258
    {
259
        return new Collection($models);
260
    }
261
262
    /**
263
     * Get the database connection for the model.
264
     *
265
     * @return \Childish\connection\Connection
266
     */
267
    public function getConnection()
268
    {
269
        return static::resolveConnection($this->getConnectionName());
270
    }
271
272
    /**
273
     * Get the current connection name for the model.
274
     *
275
     * @return string
276
     */
277
    public function getConnectionName()
278
    {
279
        return $this->connection;
280
    }
281
282
    /**
283
     * Set the connection associated with the model.
284
     *
285
     * @param  string $name
286
     * @return $this
287
     */
288
    public function setConnection($name)
289
    {
290
        $this->connection = $name;
291
292
        return $this;
293
    }
294
295
    /**
296
     * Resolve a connection instance.
297
     *
298
     * @param  string|null $connection
299
     * @return \Childish\connection\Connection
300
     */
301
    public static function resolveConnection($connection = null)
302
    {
303
        return static::$resolver->connection($connection);
304
    }
305
306
    /**
307
     * Get the connection resolver instance.
308
     *
309
     * @return  \Childish\database\DatabaseManager $resolver
310
     */
311
    public static function getConnectionResolver()
312
    {
313
        return static::$resolver;
314
    }
315
316
    /**
317
     * et the connection resolver instance.
318
     *
319
     * @static
320
     * @param \Childish\database\DatabaseManager $resolver
321
     */
322
    public static function setConnectionResolver(DatabaseManager $resolver)
323
    {
324
        static::$resolver = $resolver;
325
    }
326
327
    /**
328
     * Unset the connection resolver for models.
329
     *
330
     * @return void
331
     */
332
    public static function unsetConnectionResolver()
333
    {
334
        static::$resolver = null;
335
    }
336
337
    /**
338
     * Get the table associated with the model.
339
     *
340
     * @return string
341
     */
342
    public function getTable()
343
    {
344
        if (!isset($this->table)) {
345
            return str_replace('\\', '', Tools::snake(Tools::plural(Tools::Basename($this))));
346
        }
347
348
        return $this->table;
349
    }
350
351
    /**
352
     * Set the table associated with the model.
353
     *
354
     * @param  string $table
355
     * @return $this
356
     */
357
    public function setTable($table)
358
    {
359
        $this->table = $table;
360
361
        return $this;
362
    }
363
364
    /**
365
     * Get the name of the "created at" column.
366
     *
367
     * @return string
368
     */
369
    public function getCreatedAtColumn()
370
    {
371
        return static::CREATED_AT;
372
    }
373
374
    /**
375
     * Get the name of the "updated at" column.
376
     *
377
     * @return string
378
     */
379
    public function getUpdatedAtColumn()
380
    {
381
        return static::UPDATED_AT;
382
    }
383
384
    /**
385
     * Get a fresh timestamp for the model.
386
     *
387
     * @return string
388
     */
389
    public function freshTimestampString()
390
    {
391
        if (false === static::DATE_FORMAT) {
392
            return time();
393
        }
394
        return date(static::DATE_FORMAT);
395
    }
396
397
    /**
398
     * Create a new model instance that is existing.
399
     *
400
     * @param  array       $attributes
401
     * @param  string|null $connection
402
     * @return static
403
     */
404
    public function newFromBuilder($attributes = [], $connection = null)
405
    {
406
        $model = $this->newInstance([], true);
407
408
        $model->attributes = (array)$attributes;
409
410
        $model->setConnection($connection ? : $this->getConnectionName());
411
412
        return $model;
413
    }
414
}