Manipulação e Análise de Requisições no Framework ThinkPHP 6

Instanciação do Objeto de Requisição

Injeção via Construtor

O objeto de requisição pode ser injetado diretamente no construtor do controlador, permitindo seu uso em qualquer método da classe.

Controlador app/controller/ProductCatalog.php

<?php
namespace app\controller;

use think\Request;

class ProductCatalog
{
    protected Request $httpRequest;

    public function __construct(Request $request)
    {
        $this->httpRequest = $request;
    }

    public function listItems()
    {
        return $this->httpRequest->param('category_id');
    }
}

Teste e resultado:

http://localhost:8000/catalog?category_id=electronics
electronics

Injeção via Método da Ação

Alternativamente, a injeção de dependência pode ocorrer diretamente no método da ação que necessita do objeto.

Controlador app/controller/ProductCatalog.php

<?php
namespace app\controller;

use think\Request;

class ProductCatalog
{
    public function showDetails(Request $request)
    {
        return $request->param('sku_code');
    }
}

Teste e resultado:

http://localhost:8000/catalog/details?sku_code=ABC-9921
ABC-9921

Uso via Facade (Chamada Estática)

O framework fornece uma Facade para acesso estático ao objeto de requisição atual.

Controlador app/controller/ProductCatalog.php

<?php
namespace app\controller;

use think\facade\Request;

class ProductCatalog
{
    public function search()
    {
        return Request::param('search_query');
    }
}

Teste e resultado:

http://localhost:8000/catalog/search?search_query=laptop
laptop

Utilização de Funções Auxiliares (Helpers)

Para uma abordagem mais rápida, o ThinkPHP disponibiliza a função global request().

Controlador app/controller/ProductCatalog.php

<?php
namespace app\controller;

class ProductCatalog
{
    public function filter()
    {
        return request()->param('min_price');
    }
}

Teste e resultado:

http://localhost:8000/catalog/filter?min_price=150
150

Extração de Metadados da Requisição

É possível extrair diversas informações sobre o ambiente e a URL da requisição atual.

Controlador app/controller/SystemMonitor.php

<?php
namespace app\controller;

use think\facade\Request;

class SystemMonitor
{
    public function track()
    {
         return Request::baseUrl();
    }
}

Teste e resultado:

http://localhost:8000/monitor/track?env=production
/monitor/track

Métodos disponíveis para extração de informações:

Método Descrição
host Domínio ou endereço IP do servidor
scheme Protocolo utilizado (http/https)
port Porta de acesso do servidor
remotePort Porta remota do cliente
protocol Prootcolo do servidor (ex: HTTP/1.1)
contentType Tipo de conteúdo da requisição
domain Domínio completo com protocolo
subDomain Subdomínio atual
panDomain Pan-domínio (wildcard)
rootDomain Domínio raiz
url URL completa da requisição
baseUrl URL sem a string de consulta (query string)
query String de consulta (query string)
baseFile Arquivo de entrada em execução
root Endereço raiz de acesso
rootUrl Diretório raiz da URL
pathinfo Informações de pathinfo da URL (inclui sufixo)
ext Sufixo da URL
time Timestamp da requisição
type Tipo de recurso solicitado
method Método HTTP utilizado (GET, POST, etc)
rule Instância do objeto de rota atual

Identificação de Controlador e Ação

O framework permite introspecção para descobrir qual controlador e método estão sendo executados.

// Obter nome do controlador
Request::controller();
Request::controller(true); // Retorna em minúsculas

// Obter nome da ação
Request::action();
Request::action(true); // Retorna em minúsculas

// Converter para formato snake_case (sublinhado)
parse_name(Request::controller());
parse_name(Request::action());

Validação e Extração de Parâmetros

Antes de processar dados, é recomendável verificar sua existência e definir valores padrão.

Controlador app/controller/OrderProcessing.php

<?php
namespace app\controller;

use think\facade\Request;

class OrderProcessing
{
    public function checkout()
    {
        // Verificar existência de parâmetro
        $hasDiscount = Request::has('promo_code', 'get');
        var_dump($hasDiscount);
        
        // Obter parâmetro com valor padrão
        $shippingMethod = Request::param('shipping_type', 'standard');
        var_dump($shippingMethod);
    }
}

Teste e resultado:

http://localhost:8000/orders/checkout?promo_code=SAVE20&shipping_type=express
bool(true) string(7) "express"

Mecanismos de Filtragem e Sanitização

Filtragem Global

Filtros podem ser aplicados a todos os parâmetros de entrada estendendo a classe base de requisição.

Classe Request app/Request.php

<?php
namespace app;

class Request extends \think\Request
{
    protected $filter = ['htmlspecialchars'];
}

Controlador app/controller/UserProfile.php

<?php
namespace app\controller;

use app\BaseController;
use think\facade\Request;

class UserProfile extends BaseController
{
    public function updateBio()
    {
        $bioText = Request::get('bio');
        var_dump($bioText);
    }
}

Teste e resultado:

http://localhost:8000/profile/bio?bio=%3Cscript%3Ealert(1)%3C/script%3E
string(29) "<script>alert(1)</script>"

Filtragem Local e por Método

Filtros também podem ser definidos em tempo de execução dentro do controlador ou diretamente no método de extração.

Controlador app/controller/UserProfile.php

<?php
namespace app\controller;

use think\facade\Request;

class UserProfile
{
    public function updateNickname()
    {
        // Aplicar filtro local
        Request::filter(['trim', 'strtolower']);
        $nickname = Request::get('nick');
        var_dump($nickname);
    }
}

Filtragem direta no método de obtenção:

// Obter variável GET aplicando md5
Request::get('token', '', 'md5'); 

// Obter variável param aplicando strip_tags
Request::param('description', '', 'strip_tags'); 

// Obter variável POST aplicando método de classe customizada
Request::post('comment', '', 'app\utils\Sanitizer::cleanHtml');

Verificação do Tipo de Requisição

O objeto de requisição expõe métodos booleanos para identificar a natureza da chamada HTTP.

Propósito Método
Obter método HTTP atual method
Verificar se é GET isGet
Verificar se é POST isPost
Verificar se é PUT isPut
Verificar se é DELETE isDelete
Verificar se é AJAX isAjax
Verificar se é PJAX isPjax
Verificar se é JSON isJson
Verificar se é acesso mobile isMobile
Verificar se é HEAD isHead
Verificar se é PATCH isPatch
Verificar se é OPTIONS isOptions
Verificar se é execução CLI isCli
Verificar se é modo CGI isCgi

Acesso aos Cabeçalhos HTTP

Os cabeçalhos da requisição podem ser recuperados como um array associativo.

$headers = Request::header();
echo $headers['content-type'];
echo $headers['authorization'];
echo $headers['accept-language'];

Configuração de Cache de Requisição

Rotas podem ser configuradas para armazenar em cache a resposta de requisições GET, melhorando a performance.

// Definir rota GET com cache de 1800 segundos (30 minutos)
Route::get('api/products/:id', 'ProductApi/fetch')->cache(1800);

Tags: thinkphp6 php-framework request-handling dependency-injection http-routing

Publicado em 6-18 22:08