X. Chapitre 10 : Les filtres▲
Nous allons maintenant voir un fichier que nous n'avons pas encore ouvert : filters.php. Avec son nom vous devez déjà vous douter de son utilité, il va effectivement nous servir à effectuer des filtrages. À quoi servent les filtres ? Tout simplement à créer au niveau des routes un tri pour ne laisser passer que les informations utiles. Nous verrons aussi plus tard que c'est le lieu idéal pour vérifier qu'un utilisateur est authentifié. Si vous ouvrez le fichier filters.php vous trouvez déjà du code :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
<?php
/*
|--------------------------------------------------------------------------
| Application & Route Filters
|--------------------------------------------------------------------------
|
| Below you will find the "before" and "after" events for the application
| which may be used to do any work before or after a request into your
| application. Here you may also register your custom route filters.
|
*/
App::
before(function
($request
)
{
//
}
);
App::
after(function
($request
,
$response
)
{
//
}
);
/*
|--------------------------------------------------------------------------
| Authentication Filters
|--------------------------------------------------------------------------
|
| The following filters are used to verify that the user of the current
| session is logged into this application. The "basic" filter easily
| integrates HTTP Basic authentication for quick, simple checking.
|
*/
Route::
filter('auth'
,
function
()
{
if
(Auth::
guest()) return
Redirect::
guest('login'
);
}
);
Route::
filter('auth.basic'
,
function
()
{
return
Auth::
basic();
}
);
/*
|--------------------------------------------------------------------------
| Guest Filter
|--------------------------------------------------------------------------
|
| The "guest" filter is the counterpart of the authentication filters as
| it simply checks that the current user is not logged in. A redirect
| response will be issued if they are, which you may freely change.
|
*/
Route::
filter('guest'
,
function
()
{
if
(Auth::
check()) return
Redirect::
to('/'
);
}
);
/*
|--------------------------------------------------------------------------
| CSRF Protection Filter
|--------------------------------------------------------------------------
|
| The CSRF filter is responsible for protecting your application against
| cross-site request forgery attacks. If this special token in a user
| session does not match the one given in this request, we'll bail.
|
*/
Route::
filter('csrf'
,
function
()
{
if
(Session::
token() !=
Input::
get('_token'
))
{
throw
new
Illuminate\Session\TokenMismatchException;
}
}
);
Nous avons en premier des filtres pour l'application, c'est-à-dire qu'ici nous pouvons traiter les requêtes avant même qu'elles ne soient triées par les routes avec App::before et de même nous pouvons traiter la réponse finale avec App::after. Testons déjà cela, entrez ce code :
Ensuite tapez n'importe quelle requête, par exemple http://localhost/laravel/public. Voilà ce que j'obtiens :
2.
3.
4.
5.
6.
7.
La requête est GET /laravel/public/ HTTP/1.1 Accept: text/html,
application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate Accept-Language: fr,fr-fr;
q=0.8,en-us;q=0.5,en;q=0.3 Connection: keep-alive
Host: localhost Referer: http://localhost/laravel/
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0)
Gecko/20100101 Firefox/25.0
J'ai bien le contenu complet de la requête. On pourrait tester de la même façon la réponse, mais vous avez compris le principe. Supprimez le code que nous avons entré sinon plus rien ne marchera .
X-A. Notre premier filtre▲
Maintenant nous allons voir comment écrire des filtres. Entrez ce code juste à la suite des filtres de l'application dans le fichier des filtres :
Nous avons créé un filtre sur la variable id_article, si celle-ci est supérieure à 100 on effectue un traitement particulier. Maintenant nous allons utiliser ce filtre dans une route :
Et finalement un formulaire pour faire fonctionner tout ça :
Nous obtenons pour une valeur inférieure à 101 :
Traitement d'un article avec un id inférieur ou égal à 100
Et pour une valeur supérieure :
Traitement d'un article avec un id supérieur à 100
X-A-1. Appliquer plusieurs filtres▲
Nous ne sommes pas limités à un filtre par route, nous allons compléter notre exemple. Ajoutez ce filtre :
Modifiez ainsi la route :
Et complétez ainsi le formulaire :
Maintenant vous avez un filtrage sur deux entrées.
X-A-2. Appliquer un filtre à plusieurs routes▲
On peut aussi appliquer un (ou plusieurs) filtre(s) à plusieurs routes. Pour montrer ça, on garde le filtre sur l'id_article et on crée ces routes :
Testez avec ces deux formulaires :
Vous devriez avoir le même résultat.
X-A-3. Filtres sur les contrôleurs▲
Il est aussi évidemment possible d'appliquer des filtres à des contrôleurs. On peut le faire de façon similaire à ce que nous avons vu pour les routes. Modifiez ainsi le code du contrôleur HomeController :
2.
3.
4.
5.
6.
7.
class HomeController extends
BaseController {
public
function
articles()
{
return
'Traitement d
\'
un article avec un id inférieur ou égal à 100'
;
}
}
Créez cette route :
Route::
get('
articles
'
,
array('
before
'
=>
'
big_article
'
,
'
uses
'
=>
'
HomeController@articles
'
));
Et utilisez ce formulaire :
Vous aurez le même résultat que pour les routes vues ci-dessus.
On peut aussi déclarer le filtre dans le constructeur du contrôleur :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
class HomeController extends
BaseController {
public
function
__construct
()
{
$this
->
beforeFilter('big_article'
);
}
public
function
articles()
{
return
'Traitement d
\'
un article avec un id inférieur ou égal à 100'
;
}
}
Et se contenter alors d'une route simple :
Route::
get('
articles
'
,
'
HomeController@articles
'
);
Le résultat sera le même. Enfin vous pouvez aussi écrire la logique du filtre directement dans le contrôleur :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
class HomeController extends
BaseController {
public
function
__construct
()
{
$this
->
beforeFilter(function
()
{
if
(Input::
get('id_article'
) >
100
)
{
return
'Traitement d
\'
un article avec un id supérieur à 100'
;
}
}
);
}
public
function
articles()
{
return
'Traitement d
\'
un article avec un id inférieur ou égal à 100'
;
}
}