Pour les développeurs expérimentés de Yii2, le changement de comportement par défaut du filtrage de POST dans Yii1 vers GET dans GridView de Yii2 crée souvent un besoin d’implémentation personnalisée. Cet article discutera des techniques avancées pour changer les méthodes de requête GridView de GET vers POST, y compris les importantes considérations de sécurité et de performance qui nécessitent une attention.
Le framework Yii2 adopte la méthode GET par défaut pour les opérations de filtrage dans le widget GridView, contrairement à son prédécesseur Yii1 qui utilisait POST. Bien que la méthode GET soit plus facile pour l’implémentation du cache et la mise en signet, dans certains scénarios d’environnement de production, l’utilisation de POST devient une exigence obligatoire car :
- Considérations de sécurité pour les données sensibles
- Limitations de longueur sur les paramètres de chaîne de requête
- Propreté des URL et considérations SEO
- Prévention des attaques CSRF via la validation des jetons
Implémentation de la Méthode POST dans GridView
Voici l’implémentation technique pour configurer GridView en utilisant la méthode POST avec l’intégration Pjax.
Configuration de la Vue
Modifiez le fichier de vue avec la configuration suivante du widget Pjax :
<?php
use yii\widgets\Pjax;
use yii\grid\GridView;
Pjax::begin([
'id' => 'grid-pjax',
'timeout' => 5000,
'enablePushState' => false,
'enableReplaceState' => false,
'clientOptions' => [
'method' => 'POST',
'skipOuterContainers' => true
]
]);
?>
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => require __DIR__ . '/_columns.php',
'layout' => "{items}\n{pager}",
]); ?>
<?php Pjax::end(); ?>Configuration des Paramètres :
enablePushState: false– Empêche la mise à jour de l’historique du navigateurenableReplaceState: false– Désactive le remplacement d’URLmethod: 'POST'– Définit la méthode HTTP sur POSTtimeout: 5000– Définit le délai d’attente de la requête à 5 secondes
Modification du Contrôleur
Dans le contrôleur, changez la gestion des paramètres de queryParams à post() :
public function actionIndex()
{
$searchModel = new YourSearchModel();
$dataProvider = $searchModel->search(
Yii::$app->request->post()
);
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}Configuration Avancée et Bonnes Pratiques
Pour les environnements de production, considérez l’implémentation suivante :
Protection CSRF
Pjax::begin([
'id' => 'grid-pjax',
'clientOptions' => [
'method' => 'POST',
'data' => [
Yii::$app->request->csrfParam => Yii::$app->request->csrfToken
]
]
]);Gestionnaire de Filtre Personnalisé
// Dans SearchModel
public function search($params)
{
$query = YourModel::find();
$dataProvider = new ActiveDataProvider([
'query' => $query,
'pagination' => [
'pageSize' => 20,
],
'sort' => [
'defaultOrder' => ['id' => SORT_DESC]
]
]);
if (!empty($params) && $this->load($params)) {
// Appliquer les filtres ici
$query->andFilterWhere(['like', 'attribute', $this->attribute]);
}
return $dataProvider;
}Note de Performance : L’implémentation de la méthode POST avec Pjax peut augmenter l’utilisation de la mémoire sur les grands ensembles de données. Il est recommandé d’implémenter une pagination appropriée et une optimisation des requêtes.
Débogage et Dépannage
- Assurez-vous que l’ID Pjax est cohérent entre l’initialisation et la fin
- Vérifiez la validation du jeton CSRF sur les requêtes POST
- Vérifiez la console du navigateur pour les erreurs JavaScript
- Surveillez l’onglet réseau pour l’inspection requête/réponse
Avec une implémentation appropriée, la conversion de GridView de GET vers POST peut fournir une sécurité améliorée et une flexibilité sans compromettre l’expérience utilisateur optimale.

