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);