Descrição
Obtendo o objeto de solicitação
webman irá injetar automaticamente o objeto de solicitação no primeiro parâmetro do método de ação, por exemplo
Exemplo
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function hello(Request $request)
{
$default_name = 'webman';
// Obtém o parâmetro name da solicitação GET; se o parâmetro name não for passado, retorna $default_name
$name = $request->get('name', $default_name);
// Retorna a string para o navegador
return response('hello ' . $name);
}
}
Com o objeto $request
, podemos acessar qualquer dado relacionado à solicitação.
Às vezes, queremos obter o objeto $request
atual em outras classes; nesse caso, podemos usar a função auxiliar request()
para isso;
Obtendo parâmetros da solicitação GET
Obter todo o array GET
$request->get();
Se a solicitação não tiver parâmetros GET, retornará um array vazio.
Obter um valor específico do array GET
$request->get('name');
Se o array GET não contiver esse valor, retornará null.
Você também pode passar um valor padrão como segundo parâmetro para o método get; se o valor correspondente não for encontrado no array GET, retornará o valor padrão. Por exemplo:
$request->get('name', 'tom');
Obtendo parâmetros da solicitação POST
Obter todo o array POST
$request->post();
Se a solicitação não tiver parâmetros POST, retornará um array vazio.
Obter um valor específico do array POST
$request->post('name');
Se o array POST não contiver esse valor, retornará null.
Assim como no método get, você também pode passar um valor padrão como segundo parâmetro para o método post; se o valor correspondente não for encontrado no array POST, retornará o valor padrão. Por exemplo:
$request->post('name', 'tom');
Função auxiliar input()
Semelhante ao método $request->input()
, pode obter todos os parâmetros; a função auxiliar input() tem dois parâmetros:
- name: nome do parâmetro a ser obtido (se estiver vazio, pode obter um array de todos os parâmetros)
- default: valor padrão (se falhar na obtenção com o primeiro parâmetro, usará o valor deste parâmetro)
Por exemplo
// Obter o parâmetro name
$name = input('name');
// Obter o parâmetro name, se não existir, use o valor padrão
$name = input('name', '张三');
// Obter todos os parâmetros
$all_params = input();
Obtendo o corpo da solicitação POST original
$post = $request->rawBody();
Esta função é semelhante à operação file_get_contents("php://input");
em php-fpm
. É usada para obter o corpo da solicitação HTTP original. Isso é útil ao obter dados de solicitações POST que não estão no formato application/x-www-form-urlencoded
.
Obtendo headers
Obter todo o array de headers
$request->header();
Se a solicitação não tiver parâmetros de header, retornará um array vazio. Note que todas as chaves são minúsculas.
Obter um valor específico do array de headers
$request->header('host');
Se o array de headers não contiver esse valor, retornará null. Note que todas as chaves são minúsculas.
Assim como no método get, você também pode passar um valor padrão como segundo parâmetro para o método header; se o valor correspondente não for encontrado no array de headers, retornará o valor padrão. Por exemplo:
$request->header('host', 'localhost');
Obtendo cookies
Obter todo o array de cookies
$request->cookie();
Se a solicitação não tiver parâmetros de cookie, retornará um array vazio.
Obter um valor específico do array de cookies
$request->cookie('name');
Se o array de cookies não contiver esse valor, retornará null.
Assim como no método get, você também pode passar um valor padrão como segundo parâmetro para o método cookie; se o valor correspondente não for encontrado no array de cookies, retornará o valor padrão. Por exemplo:
$request->cookie('name', 'tom');
Obtendo todos os inputs
Contém uma coleção de post
e get
.
$request->all();
Obtendo um valor de input específico
Obtém um valor da coleção de post
e get
.
$request->input('name', $default_value);
Obtendo dados de input parciais
Obtém dados parciais da coleção de post
e get
.
// Obtém um array com username e password; se as chaves correspondentes não existirem, serão ignoradas
$only = $request->only(['username', 'password']);
// Obtém todos os inputs, exceto avatar e age
$except = $request->except(['avatar', 'age']);
Obtendo inputs através de parâmetros do controlador
<?php
namespace app\controller;
use support\Response;
class UserController
{
public function create(string $name, int $age = 18): Response
{
return json(['name' => $name, 'age' => $age]);
}
}
A lógica do código é semelhante a
<?php
namespace app\controller;
use support\Request;
use support\Response;
class UserController
{
public function create(Request $request): Response
{
$name = $request->input('name');
$age = (int)$request->input('age', 18);
return json(['name' => $name, 'age' => $age]);
}
}
Para mais informações, consulte Vinculação de parâmetros de controlador
Obtendo arquivos enviados
Dica
O upload de arquivos requer um formulário com o formatomultipart/form-data
.
Obter todo o array de arquivos enviados
$request->file();
O formulário semelhante a:
<form method="post" action="http://127.0.0.1:8787/upload/files" enctype="multipart/form-data" />
<input name="file1" multiple="multiple" type="file">
<input name="file2" multiple="multiple" type="file">
<input type="submit">
</form>
O formato retornado por $request->file()
é semelhante a:
array (
'file1' => object(webman\Http\UploadFile),
'file2' => object(webman\Http\UploadFile)
)
É um array de instâncias de webman\Http\UploadFile
. A classe webman\Http\UploadFile
herda da classe interna do PHP SplFileInfo
e oferece alguns métodos úteis.
<?php
namespace app\controller;
use support\Request;
class UploadController
{
public function files(Request $request)
{
foreach ($request->file() as $key => $spl_file) {
var_export($spl_file->isValid()); // Verifica se o arquivo é válido, por exemplo true|false
var_export($spl_file->getUploadExtension()); // Retorna a extensão do arquivo enviado, por exemplo 'jpg'
var_export($spl_file->getUploadMimeType()); // Retorna o tipo MIME do arquivo enviado, por exemplo 'image/jpeg'
var_export($spl_file->getUploadErrorCode()); // Obtém o código de erro do upload, por exemplo UPLOAD_ERR_NO_TMP_DIR UPLOAD_ERR_NO_FILE UPLOAD_ERR_CANT_WRITE
var_export($spl_file->getUploadName()); // Nome do arquivo enviado, por exemplo 'my-test.jpg'
var_export($spl_file->getSize()); // Obtém o tamanho do arquivo, por exemplo 13364, em bytes
var_export($spl_file->getPath()); // Obtém o diretório de upload, por exemplo '/tmp'
var_export($spl_file->getRealPath()); // Obtém o caminho do arquivo temporário, por exemplo `/tmp/workerman.upload.SRliMu`
}
return response('ok');
}
}
Nota:
- Após o upload, o arquivo será nomeado como um arquivo temporário, semelhante a
/tmp/workerman.upload.SRliMu
- O tamanho máximo do arquivo enviado é limitado pelo defaultMaxPackageSize, que é 10M por padrão; você pode alterar o valor padrão em
config/server.php
modificandomax_package_size
. - Após o término da solicitação, o arquivo temporário será automaticamente removido
- Se a solicitação não tiver arquivos enviados,
$request->file()
retornará um array vazio - O método
move_uploaded_file()
não é suportado para arquivos enviados; em vez disso, use o método$file->move()
, consulte os exemplos abaixo
Obtendo um arquivo enviado específico
$request->file('avatar');
Se o arquivo existir, retornará a instância webman\Http\UploadFile
do arquivo correspondente; caso contrário, retornará null.
Exemplo
<?php
namespace app\controller;
use support\Request;
class UploadController
{
public function file(Request $request)
{
$file = $request->file('avatar');
if ($file && $file->isValid()) {
$file->move(public_path().'/files/myfile.'.$file->getUploadExtension());
return json(['code' => 0, 'msg' => 'upload success']);
}
return json(['code' => 1, 'msg' => 'file not found']);
}
}
Obtendo o host
Obtém as informações do host da solicitação.
$request->host();
Se o endereço da solicitação estiver em uma porta não padrão, como 80 ou 443, as informações do host podem incluir a porta, por exemplo example.com:8080
. Se a porta não for necessária, você pode passar o primeiro parâmetro como true
.
$request->host(true);
Obtendo o método da solicitação
$request->method();
O valor retornado pode ser um dos seguintes: GET
, POST
, PUT
, DELETE
, OPTIONS
, HEAD
.
Obtendo o URI da solicitação
$request->uri();
Retorna o URI da solicitação, incluindo as partes de path e queryString.
Obtendo o caminho da solicitação
$request->path();
Retorna a parte de path da solicitação.
Obtendo a queryString da solicitação
$request->queryString();
Retorna a parte de queryString da solicitação.
Obtendo a URL da solicitação
O método url()
retorna a URL sem os parâmetros Query
.
$request->url();
Retorna algo como //www.workerman.net/workerman-chat
O método fullUrl()
retorna a URL com os parâmetros Query
.
$request->fullUrl();
Retorna algo como //www.workerman.net/workerman-chat?type=download
Nota
url()
efullUrl()
não retornam a parte do protocolo (não retorna http ou https).
Isso ocorre porque, em navegadores, endereços que começam com//example.com
reconhecem automaticamente o protocolo atual do site, iniciando a solicitação usando http ou https.
Se você usa um proxy nginx, adicione proxy_set_header X-Forwarded-Proto $scheme;
à configuração do nginx, consulte o proxy nginx,
dessa forma você poderá usar $request->header('x-forwarded-proto');
para determinar se é http ou https, por exemplo:
echo $request->header('x-forwarded-proto'); // Saída: http ou https
Obtendo a versão HTTP da solicitação
$request->protocolVersion();
Retorna a string 1.1
ou 1.0
.
Obtendo o sessionId da solicitação
$request->sessionId();
Retorna uma string composta por letras e números.
Obtendo o IP do cliente da solicitação
$request->getRemoteIp();
Obtendo a porta do cliente da solicitação
$request->getRemotePort();
Obtendo o IP real do cliente da solicitação
$request->getRealIp($safe_mode=true);
Quando o projeto usa um proxy (por exemplo, nginx), o uso de $request->getRemoteIp()
frequentemente resulta no IP do servidor proxy (semelhante a 127.0.0.1
192.168.x.x
) e não no IP real do cliente. Neste caso, você pode tentar usar $request->getRealIp()
para obter o IP real do cliente.
O método $request->getRealIp()
tentará obter o IP real a partir dos headers HTTP x-forwarded-for
, x-real-ip
, client-ip
, x-client-ip
e via
.
Como os headers HTTP podem ser facilmente forjados, o IP do cliente obtido por este método não é 100% confiável, especialmente quando
$safe_mode
é false. Uma maneira mais confiável de obter o IP real do cliente passando por um proxy é conhecer o IP do servidor proxy seguro e saber claramente qual header HTTP carrega o IP real; se o IP retornado por$request->getRemoteIp()
for confirmado como um servidor proxy seguro conhecido, você pode obter o IP real através de$request->header('HTTP_HEADER_QUE_TRANSPORTA_IP_REAL')
.
Obtendo o IP do servidor
$request->getLocalIp();
Obtendo a porta do servidor
$request->getLocalPort();
Verificando se é uma solicitação AJAX
$request->isAjax();
Verificando se é uma solicitação PJAX
$request->isPjax();
Verificando se a resposta esperada é JSON
$request->expectsJson();
Verificando se o cliente aceita resposta em JSON
$request->acceptJson();
Obtendo o nome do plugin da solicitação
Solicitações não de plugins retornam uma string vazia ''
.
$request->plugin;
Obtendo o nome do aplicativo da solicitação
Em um aplicativo único, sempre retorna uma string vazia ''
; em um múltiplo, retorna o nome do aplicativo.
$request->app;
Como funções de closure não pertencem a nenhum aplicativo, a solicitação vinda de uma rota de closure fará com que
$request->app
retorne sempre uma string vazia''
.
Para rotas de closure, consulte Rotas.
Obtendo o nome da classe do controlador da solicitação
Obtém o nome da classe correspondente ao controlador.
$request->controller;
Retorna algo como app\controller\IndexController
.
Como funções de closure não pertencem a nenhum controlador, a solicitação vinda de uma rota de closure fará com que
$request->controller
retorne sempre uma string vazia''
.
Para rotas de closure, consulte Rotas.
Obtendo o nome do método da solicitação
Obtém o nome do método do controlador correspondente à solicitação.
$request->action;
Retorna algo como index
.
Como funções de closure não pertencem a nenhum controlador, a solicitação vinda de uma rota de closure fará com que
$request->action
retorne sempre uma string vazia''
.
Para rotas de closure, consulte Rotas.
Reescrevendo parâmetros
Às vezes, queremos reescrever os parâmetros da solicitação, por exemplo, filtrar a solicitação e depois reatribuí-la ao objeto de solicitação; nesse caso, podemos usar os métodos setGet()
, setPost()
e setHeader()
.
Reescrevendo parâmetros GET
$request->get(); // Supondo que obtenha ['name' => 'tom', 'age' => 18]
$request->setGet(['name' => 'tom']);
$request->get(); // Finaliza com ['name' => 'tom']
Nota
Como mostrado no exemplo,setGet()
reescreve todos os parâmetros GET, e o comportamento é o mesmo parasetPost()
esetHeader()
.
Reescrevendo parâmetros POST
$post = $request->post();
foreach ($post as $key => $value) {
$post[$key] = htmlspecialchars($value);
}
$request->setPost($post);
$request->post(); // Obtém os parâmetros post filtrados
Reescrevendo parâmetros HEADER
$request->setHeader(['host' => 'example.com']);
$request->header('host'); // Saída: example.com