Yii2: GridView avançado com GET para POST e Pjax

Advertisement

Para desenvolvedores experientes de Yii2, a mudança no comportamento padrão de filtragem de POST no Yii1 para GET no GridView do Yii2 frequentemente cria a necessidade de uma implementação personalizada. Este artigo discutirá técnicas avançadas para alterar os métodos de solicitação do GridView de GET para POST, incluindo considerações importantes de segurança e desempenho que exigem atenção.

Advertisement

O framework Yii2 adota o método GET como padrão para operações de filtragem no widget GridView, diferentemente de seu predecessor Yii1 que usava POST. Embora o método GET seja mais fácil para implementação de cache e favoritos, em alguns cenários de ambiente de produção, o uso de POST torna-se uma exigência obrigatória porque:

  • Considerações de segurança para dados sensíveis
  • Limitações de comprimento nos parâmetros da string de consulta
  • Limpeza de URL e considerações de SEO
  • Prevenção de ataques CSRF através da validação de token

Implementação do Método POST no GridView

A seguir está a implementação técnica para configurar o GridView usando o método POST com integração Pjax.

Advertisement

Configuração da View

Modifique o arquivo de view com a seguinte configuração do 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(); ?>

Configuração de Parâmetros:

Advertisement
  • enablePushState: false – Impede atualização do histórico do navegador
  • enableReplaceState: false – Desativa a substituição de URL
  • method: 'POST' – Define o método HTTP como POST
  • timeout: 5000 – Define o tempo limite da solicitação para 5 segundos

Modificação do Controller

No controller, altere o tratamento de parâmetros de queryParams para post():

public function actionIndex()
{
    $searchModel = new YourSearchModel();
    $dataProvider = $searchModel->search(
        Yii::$app->request->post()
    );

    return $this->render('index', [
        'searchModel' => $searchModel,
        'dataProvider' => $dataProvider,
    ]);
}

Configuração Avançada e Melhores Práticas

Para ambientes de produção, considere a seguinte implementação:

Proteção CSRF

Pjax::begin([
    'id' => 'grid-pjax',
    'clientOptions' => [
        'method' => 'POST',
        'data' => [
            Yii::$app->request->csrfParam => Yii::$app->request->csrfToken
        ]
    ]
]);

Manipulador de Filtro Personalizado

// No 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)) {
        // Aplicar filtros aqui
        $query->andFilterWhere(['like', 'attribute', $this->attribute]);
    }

    return $dataProvider;
}

Nota de Desempenho: A implementação do método POST com Pjax pode aumentar o uso de memória em grandes conjuntos de dados. É recomendado implementar paginação adequada e otimização de consultas.

Depuração e Solução de Problemas

Com a implementação adequada, a conversão do GridView de GET para POST pode fornecer segurança aprimorada e flexibilidade sem comprometer a experiência ideal do usuário.

Últimos artigos