Passed
Push — main ( 7ca792...577f5e )
by Dimitri
03:34
created

BaseController::forceHTTPS()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 1
dl 0
loc 3
rs 10
c 0
b 0
f 0
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\Exceptions\HttpException;
15
use BlitzPHP\Http\Request;
16
use BlitzPHP\Http\Response;
17
use BlitzPHP\Loader\Services;
18
use BlitzPHP\Router\Dispatcher;
19
use BlitzPHP\Validation\Validation;
20
use Dimtrovich\Validation\ValidatedInput;
21
use Psr\Http\Message\ResponseInterface;
22
use Psr\Http\Message\ServerRequestInterface;
23
use Psr\Log\LoggerInterface;
24
use ReflectionException;
25
26
/**
27
 * Contrôleur de base pour toute application BlitzPHP
28
 */
29
abstract class BaseController
30
{
31
    /**
32
     * Helpers qui seront automatiquement chargés lors de l'instanciation de la classe.
33
     *
34
     * @var array
35
     */
36
    protected $helpers = [];
37
38
    /**
39
     * Le modèle qui contient les données de cette ressource
40
     *
41
     * @var string|null
42
     */
43
    protected $modelName;
44
45
    /**
46
     * Le modèle qui contient les données de cette ressource
47
     *
48
     * @var object|null
49
     */
50
    protected $model;
51
52
    /**
53
     * Instance de l'objet Request principal.
54
     *
55
     * @var Request
56
     */
57
    protected $request;
58
59
    /**
60
     * Instance de l'objet de Response principal.
61
     *
62
     * @var Response
63
     */
64
    protected $response;
65
66
    /**
67
     * Instance de logger à utiliser.
68
     *
69
     * @var LoggerInterface
70
     */
71
    protected $logger;
72
73
    /**
74
     * Devrait appliquer l'accès HTTPS pour toutes les méthodes de ce contrôleur.
75
     *
76
     * @var int Nombre de secondes pour définir l'en-tête HSTS
77
     */
78
    protected $forceHTTPS = 0;
79
80
    /**
81
     * Constructor.
82
     *
83
     * @throws HttpException
84
     */
85
    public function initialize(ServerRequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
86
    {
87
        $this->request  = $request; // @phpstan-ignore-line
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...
88
        $this->response = $response; // @phpstan-ignore-line
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...
89
        $this->logger   = $logger;
90
91
        Services::container()->set(Request::class, $request);
92
        Services::container()->set(Response::class, $response);
93
94
        if ($this->forceHTTPS > 0) {
95
            $this->forceHTTPS($this->forceHTTPS);
96
        }
97
98
        $this->getModel();
99
100
        if (! empty($this->helpers)) {
101
            helper($this->helpers);
102
        }
103
    }
104
105
    /**
106
     * Validation des donnees de la requete actuelle
107
     */
108
    protected function validate(array $rules, array $messages = []): ValidatedInput
109
    {
110
        return $this->request->validate($rules, $messages);
111
    }
112
113
    /**
114
     * Cree un validateur avec les donnees de la requete actuelle
115
     */
116
    protected function validation(array $rules, array $messages = []): Validation
117
    {
118
        return $this->request->validation($rules, $messages);
119
    }
120
121
    /**
122
     * Définissez ou modifiez le modèle auquel ce contrôleur est lié.
123
     * Étant donné le nom ou l'objet, déterminer l'autre.
124
     *
125
     * @param object|string|null $which
126
     */
127
    protected function setModel($which = null)
128
    {
129
        if ($which) {
130
            $this->model     = is_object($which) ? $which : null;
131
            $this->modelName = is_object($which) ? null : $which;
132
        }
133
134
        if (empty($this->model) && ! empty($this->modelName) && class_exists($this->modelName)) {
135
            $this->model = model($this->modelName);
136
        }
137
138
        if (! empty($this->model) && empty($this->modelName)) {
139
            $this->modelName = get_class($this->model);
140
        }
141
    }
142
143
    /**
144
     * Une méthode pratique à utiliser lorsque vous devez vous assurer qu'un seul
145
     * La méthode est accessible uniquement via HTTPS. Si ce n'est pas le cas, alors une redirection
146
     * reviendra à cette méthode et l'en-tête HSTS sera envoyé
147
     * pour que les navigateurs modernes transforment automatiquement les requêtes.
148
     *
149
     * @param int $duration Le nombre de secondes pendant lesquelles ce lien doit être
150
     *                      considéré comme sûr pour. Uniquement avec en-tête HSTS.
151
     *                      La valeur par défaut est 1 an.
152
     *
153
     * @throws HttpException
154
     */
155
    protected function forceHTTPS(int $duration = 31536000)
156
    {
157
        force_https($duration, $this->request, $this->response);
158
    }
159
160
    /**
161
     * Fournit un moyen simple de se lier à la classe principale de BlitzPHP
162
     * et de lui indiquer la durée de mise en cache de la page actuelle.
163
     */
164
    protected function cachePage(int $time)
165
    {
166
        Dispatcher::cache($time);
167
    }
168
169
    /**
170
     * Recherche le model par defaut (à base de son nom) du controleur
171
     *
172
     * @throws ReflectionException
173
     */
174
    private function getModel()
175
    {
176
        if (! empty($this->modelName)) {
177
            $model = $this->modelName;
178
        } else {
179
            $model = str_replace('Controller', 'Model', static::class);
180
        }
181
182
        if (class_exists($model)) {
183
            $this->setModel($model);
184
        }
185
    }
186
}
187