Passed
Push — main ( 5ed6ff...c7b99b )
by Dimitri
28:04
created

BaseController::validateData()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 6
c 1
b 0
f 0
nc 2
nop 3
dl 0
loc 9
ccs 0
cts 4
cp 0
crap 6
rs 10
1
<?php
2
3
/**
4
 * This file is part of Blitz PHP framework.
5
 *
6
 * (c) 2022 Dimitri Sitchet Tomkeu <[email protected]>
7
 *
8
 * For the full copyright and license information, please view
9
 * the LICENSE file that was distributed with this source code.
10
 */
11
12
namespace BlitzPHP\Controllers;
13
14
use BlitzPHP\Container\Services;
15
use BlitzPHP\Exceptions\HttpException;
16
use BlitzPHP\Exceptions\ValidationException;
17
use BlitzPHP\Http\Request;
18
use BlitzPHP\Http\Response;
19
use BlitzPHP\Validation\Validation;
20
use BlitzPHP\Validation\Validator;
21
use Dimtrovich\Validation\Exceptions\ValidationException as DimtrovichValidationException;
22
use Dimtrovich\Validation\ValidatedInput;
23
use Psr\Http\Message\ResponseInterface;
24
use Psr\Http\Message\ServerRequestInterface;
25
use Psr\Log\LoggerInterface;
26
use ReflectionException;
27
28
/**
29
 * Contrôleur de base pour toute application BlitzPHP
30
 */
31
abstract class BaseController
32
{
33
    /**
34
     * Helpers qui seront automatiquement chargés lors de l'instanciation de la classe.
35
     *
36
     * @var array
37
     */
38
    protected $helpers = [];
39
40
    /**
41
     * Le modèle qui contient les données de cette ressource
42
     *
43
     * @var string|null
44
     */
45
    protected $modelName;
46
47
    /**
48
     * Le modèle qui contient les données de cette ressource
49
     *
50
     * @var object|null
51
     */
52
    protected $model;
53
54
    /**
55
     * Instance de l'objet Request principal.
56
     *
57
     * @var Request
58
     */
59
    protected $request;
60
61
    /**
62
     * Instance de l'objet de Response principal.
63
     *
64
     * @var Response
65
     */
66
    protected $response;
67
68
    /**
69
     * Instance de logger à utiliser.
70
     *
71
     * @var LoggerInterface
72
     */
73
    protected $logger;
74
75
    /**
76
     * Devrait appliquer l'accès HTTPS pour toutes les méthodes de ce contrôleur.
77
     *
78
     * @var int Nombre de secondes pour définir l'en-tête HSTS
79
     */
80
    protected $forceHTTPS = 0;
81
82
    /**
83
     * Constructeur.
84
     *
85
     * @param Request  $request
86
     * @param Response $response
87
     *
88
     * @throws HttpException
89
     */
90
    public function initialize(ServerRequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
91
    {
92
        $this->request  = $request;
0 ignored issues
show
Documentation Bug introduced by
$request is of type Psr\Http\Message\ServerRequestInterface, but the property $request was declared to be of type BlitzPHP\Http\Request. Are you sure that you always receive this specific sub-class here, or does it make sense to add an instanceof check?

Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a given class or a super-class is assigned to a property that is type hinted more strictly.

Either this assignment is in error or an instanceof check should be added for that assignment.

class Alien {}

class Dalek extends Alien {}

class Plot
{
    /** @var  Dalek */
    public $villain;
}

$alien = new Alien();
$plot = new Plot();
if ($alien instanceof Dalek) {
    $plot->villain = $alien;
}
Loading history...
93
        $this->response = $response;
0 ignored issues
show
Documentation Bug introduced by
$response is of type Psr\Http\Message\ResponseInterface, but the property $response was declared to be of type BlitzPHP\Http\Response. Are you sure that you always receive this specific sub-class here, or does it make sense to add an instanceof check?

Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a given class or a super-class is assigned to a property that is type hinted more strictly.

Either this assignment is in error or an instanceof check should be added for that assignment.

class Alien {}

class Dalek extends Alien {}

class Plot
{
    /** @var  Dalek */
    public $villain;
}

$alien = new Alien();
$plot = new Plot();
if ($alien instanceof Dalek) {
    $plot->villain = $alien;
}
Loading history...
94
        $this->logger   = $logger;
95
96
        Services::container()->set(Request::class, $request);
97
        Services::container()->set(Response::class, $response);
98
99
        if ($this->forceHTTPS > 0) {
100
            $this->forceHTTPS($this->forceHTTPS);
101
        }
102
103
        $this->getModel();
104
105
        if (! empty($this->helpers)) {
106
            helper($this->helpers);
107
        }
108
    }
109
110
    /**
111
     * Validation des donnees de la requete actuelle
112
     */
113
    protected function validate(array $rules, array $messages = []): ValidatedInput
114
    {
115
        return $this->request->validate($rules, $messages);
116
    }
117
118
    /**
119
     * Validation des donnees quelconques
120
     */
121
    protected function validateData(array $data, array $rules, array $messages = []): ValidatedInput
122
    {
123
		try {
124
            return Validator::make($data, $rules, $messages)->safe();
125
        } catch (DimtrovichValidationException $e) {
126
            $th = new ValidationException($e->getMessage());
127
            $th->setErrors($e->getErrors());
128
129
            throw $th;
130
        }
131
    }
132
133
    /**
134
     * Cree un validateur avec les donnees de la requete actuelle
135
     */
136
    protected function validation(array $rules, array $messages = []): Validation
137
    {
138
        return $this->request->validation($rules, $messages);
139
    }
140
141
    /**
142
     * Définissez ou modifiez le modèle auquel ce contrôleur est lié.
143
     * Étant donné le nom ou l'objet, déterminer l'autre.
144
     *
145
     * @param object|string|null $which
146
     */
147
    protected function setModel($which = null)
148
    {
149
        if ($which) {
150
            $this->model     = is_object($which) ? $which : null;
151
            $this->modelName = is_object($which) ? null : $which;
152
        }
153
154
        if (empty($this->model) && ! empty($this->modelName) && class_exists($this->modelName)) {
155
            $this->model = model($this->modelName);
156
        }
157
158
        if (! empty($this->model) && empty($this->modelName)) {
159
            $this->modelName = get_class($this->model);
160
        }
161
    }
162
163
    /**
164
     * Une méthode pratique à utiliser lorsque vous devez vous assurer qu'un seul
165
     * La méthode est accessible uniquement via HTTPS. Si ce n'est pas le cas, alors une redirection
166
     * reviendra à cette méthode et l'en-tête HSTS sera envoyé
167
     * pour que les navigateurs modernes transforment automatiquement les requêtes.
168
     *
169
     * @param int $duration Le nombre de secondes pendant lesquelles ce lien doit être
170
     *                      considéré comme sûr pour. Uniquement avec en-tête HSTS.
171
     *                      La valeur par défaut est 1 an.
172
     *
173
     * @throws HttpException
174
     */
175
    protected function forceHTTPS(int $duration = 31536000)
176
    {
177
        force_https($duration, $this->request, $this->response);
178
    }
179
180
    /**
181
     * Fournit un moyen simple de se lier à la classe principale de BlitzPHP
182
     * et de lui indiquer la durée de mise en cache de la page actuelle.
183
     */
184
    protected function cachePage(int $time)
185
    {
186
        Services::responsecache()->setTtl($time);
187
    }
188
189
    /**
190
     * Recherche le model par defaut (à base de son nom) du controleur
191
     *
192
     * @throws ReflectionException
193
     */
194
    private function getModel()
195
    {
196
        if (! empty($this->modelName)) {
197
            $model = $this->modelName;
198
        } else {
199
            $model = str_replace('Controller', 'Model', static::class);
200
        }
201
202
        if (class_exists($model)) {
203
            $this->setModel($model);
204
        }
205
    }
206
}
207