Laravel 4 : 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. A 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 :

<?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 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 :

App::before(function($request)
{
	return 'La requête est '.$request;
});

Ensuite tapez n’importe quelle requête, par exemple http://localhost/laravel/public. Voilà ce que j’obtiens :

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 Tongue Out.

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 :

Route::filter('big_article', function()
{
	if (Input::get('id_article') > 100)
	{
		return 'Traitement d\'un article avec un id supérieur à 100';
	}
});

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 :

Route::get('articles', array('before' => 'big_article', function()
{
	return 'Traitement d\'un article avec un id inférieur ou égal à 100';
}));

Et finalement un formulaire pour faire fonctionner tout ça :

<form action="articles" method="get">
	<input name="id_article" type="text" value="10">
	<input name="Valider" type="submit">
</form>

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

Appliquer plusieurs filtres

Nous ne sommes pas limités à un filtre par route, nous allons compléter notre exemple. Ajoutez ce filtre :

Route::filter('danger', function()
{
	if (Input::get('nom_article') == 'arme')
	{
		return 'Nous ne vendons pas ce genre de chose !';
	}
});

Modifiez ainsi la route :

Route::get('articles', array('before' => 'danger|big_article', function()
{
	return 'Traitement d\'un article avec un id inférieur ou égal à 100';
}));

Et complétez ainsi le formulaire :

<form action="articles" method="get">
	<input name="id_article" type="text" value="10">
	<input name="nom_article" type="text" value="chemise"><br>
	<input name="Valider" type="submit">
</form>

Maintenant vous avez un filtrage sur deux entrées.

Appliquer un filtre à plusieurs routes

On peut aussi appliquer un (ou plusieurs) filtre à plusieurs routes. Pour montrer ça on garde le filtre sur l’id_article et on crée ces routes :

Route::when('articles*', 'big_article');
Route::get('articles1', function()
{
	return 'Traitement d\'un article avec un id inférieur ou égal à 100';
});
Route::get('articles2', function()
{
	return 'Traitement d\'un article avec un id inférieur ou égal à 100';
});

Testez avec ces deux formulaires :

<form action="articles1" method="get">
	<input name="id_article" type="text" value="10"><br>
	<input name="Valider" type="submit">
</form>
<form action="articles2" method="get">
	<input name="id_article" type="text" value="10"><br>
	<input name="Valider" type="submit">
</form>

Vous devriez avoir le même résultat.

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 :

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 :

<form action="articles" method="get">
	<input name="id_article" type="text" value="10"><br>
	<input name="Valider" type="submit">
</form>

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 :

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 :

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';
	}
}

2 réflexions sur “Laravel 4 : chapitre 10 : Les filtres

Laisser un commentaire