Explicação

Obtendo o objeto de requisição

Webman automaticamente injetará o objeto de requisiçã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';
        // Obter o parâmetro 'name' da requisição GET, se não for passado, retorna $default_name
        $name = $request->get('name', $default_name);
        // Retornar uma string para o navegador
        return response('hello ' . $name);
    }
}

Com o objeto $request, podemos obter qualquer dado relacionado à requisição.

Às vezes, queremos obter o objeto $request na classe, nesse caso, podemos usar a função auxiliar request().

Obtendo o parâmetro de requisição GET

Obter todo o array GET

$request->get();

Se a requisição não contém parâmetros GET, retorna um array vazio.

Obter um valor específico do array GET

$request->get('name');

Se o array GET não contém esse valor, retorna null.

Também podemos fornecer um valor padrão como segundo argumento para o método get, que será retornado se o valor correspondente não for encontrado no array GET. Por exemplo:

$request->get('name', 'tom');

Obtendo o parâmetro de requisição POST

Obter todo o array POST

$request->post();

Se a requisição não contém parâmetros POST, retorna um array vazio.

Obter um valor específico do array POST

$request->post('name');

Se o array POST não contém esse valor, retorna null.

Assim como no método get, podemos fornecer um valor padrão como segundo argumento para o método post, que será retornado se o valor correspondente não for encontrado no array POST. Por exemplo:

$request->post('name', 'tom');

Obtendo o corpo bruto da requisição POST

$post = $request->rawBody();

Essa funcionalidade é semelhante à operação file_get_contents("php://input"); no php-fpm. É útil para obter o corpo bruto da requisição HTTP quando se trata de dados de requisição POST em um formato não application/x-www-form-urlencoded.

Obtendo headers

Obtendo todo o array headers

$request->header();

Se a requisição não contém headers, retorna um array vazio. Observe que todas as chaves são em letras minúsculas.

Obtendo um valor específico do array de headers

$request->header('host');

Se o array de headers não contém esse valor, retorna null. Observe que todas as chaves são em letras minúsculas.

Assim como no método get, podemos fornecer um valor padrão como segundo argumento para o método header, que será retornado se o valor correspondente não for encontrado no array de headers. Por exemplo:

$request->header('host', 'localhost');

Obtendo cookies

Obtendo todo o array de cookies

$request->cookie();

Se a requisição não contém cookies, retorna um array vazio.

Obtendo um valor específico do array de cookies

$request->cookie('name');

Se o array de cookies não contém esse valor, retorna null.

Assim como no método get, podemos fornecer um valor padrão como segundo argumento para o método cookie, que será retornado se o valor correspondente não for encontrado no array de cookies. Por exemplo:

$request->cookie('name', 'tom');

Obtendo todos os inputs

Inclui a coleção post e get.

$request->all();

Obtendo um valor específico de entrada

Obtém um valor específico da coleção post e get.

$request->input('name', $default_value);

Obtendo parte dos dados de entrada

Obtém parte dos dados da coleção post e get.

// Obter um array composto por username e password, ignorando as chaves que não existem
$only = $request->only(['username', 'password']);
// Obter todos os inputs exceto avatar e age
$except = $request->except(['avatar', 'age']);

Obtendo arquivos enviados

Obtendo todo o array de arquivos enviados

$request->file();

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 retorno de $request->file() é semelhante a:

array (
    'file1' => object(webman\Http\UploadFile),
    'file2' => object(webman\Http\UploadFile)
)

Este é um array de instâncias da classe webman\Http\UploadFile. A classe webman\Http\UploadFile herda a classe SplFileInfo integrada do PHP e fornece vários 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()); // Obtém a extensão do arquivo enviado, por exemplo, 'jpg'
            var_export($spl_file->getUploadMimeType()); // Obtém o tipo MIME do arquivo enviado, por exemplo, 'image/jpeg'
            var_export($spl_file->getUploadErrorCode()); // Obtém o código de erro do envio, por exemplo UPLOAD_ERR_NO_TMP_DIR UPLOAD_ERR_NO_FILE UPLOAD_ERR_CANT_WRITE
            var_export($spl_file->getUploadName()); // Obtém o 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 envio, 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');
    }
}

Observações:

  • Após o envio, o arquivo é renomeado para um arquivo temporário, por exemplo, /tmp/workerman.upload.SRliMu
  • O tamanho do arquivo enviado é limitado por defaultMaxPackageSize, padrão de 10 MB, e pode ser alterado em config/server.php modificando max_package_size.
  • Após a conclusão da requisição, o arquivo temporário será automaticamente removido.
  • Se a requisição não contém arquivos enviados, $request->file() retorna um array vazio.
  • O envio de arquivos não suporta o método move_uploaded_file(), deve-se utilizar o método $file->move() como substituto, consulte o exemplo abaixo.

Obtendo um arquivo de envio específico

$request->file('avatar');

Se o arquivo existe, retorna uma instância correspondente de webman\Http\UploadFile, caso contrário, retorna 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']);
    }
}

Obter host

Obter informações de host da requisição.

$request->host();

Se o endereço da requisição não estiver usando a porta padrão 80 ou 443, as informações de host podem incluir a porta, por exemplo, example.com:8080. Se você não precisa da porta, o primeiro argumento pode ser passado como true.

$request->host(true);

Obter método da requisição

$request->method();

O valor retornado pode ser um dos seguintes: GET, POST, PUT, DELETE, OPTIONS, HEAD.

Obter URI da requisição

$request->uri();

Retorna o URI da requisição, incluindo a parte do caminho e da string de consulta.

Obter caminho da requisição

$request->path();

Retorna a parte do caminho da requisição.

Obter string de consulta da requisição

$request->queryString();

Retorna a parte da string de consulta da requisição.

Obter URL da requisição

O método url() retorna a URL sem os parâmetros de consulta.

$request->url();

Retorna algo parecido com //www.workerman.net/workerman-chat.

O método fullUrl() retorna a URL com os parâmetros de consulta.

$request->fullUrl();

Retorna algo parecido com //www.workerman.net/workerman-chat?type=download.

Nota
Os métodos url() e fullUrl() não retornam a parte do protocolo (não retornam http ou https). Isso ocorre porque ao usar //example.com como um endereço que começa com //, o navegador automaticamente reconhece o protocolo do site atual e inicia a requisição usando http ou https.

Se você estiver usando um proxy nginx, adicione proxy_set_header X-Forwarded-Proto $scheme; à configuração do nginx, consulte proxy nginx. Desta forma, você pode usar $request->header('x-forwarded-proto') para verificar se é http ou https, por exemplo:

echo $request->header('x-forwarded-proto'); // exibe http ou https

Obter versão do protocolo da requisição

$request->protocolVersion();

Retorna a string 1.1 ou 1.0.

Obter ID da sessão da requisição

$request->sessionId();

Retorna uma string composta por letras e números.

Obter IP do cliente da requisição

$request->getRemoteIp();

Obter porta do cliente da requisição

$request->getRemotePort();

Obter IP real do cliente da requisiçã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 (como 127.0.0.1 192.168.x.x) em vez do IP real do cliente. Nesse caso, você pode tentar usar $request->getRealIp() para obter o IP real do cliente.

$request->getRealIp() tentará obter o IP real do cliente dos cabeçalhos HTTP x-real-ip, x-forwarded-for, client-ip, x-client-ip e via.

Como os cabeçalhos HTTP são facilmente falsificáveis, o IP do cliente obtido por este método não é totalmente confiável, especialmente quando $safe_mode é falso. Uma maneira mais confiável de obter o IP real do cliente através de um proxy é conhecer o IP seguro do servidor proxy e saber exatamente qual cabeçalho HTTP contém o IP real. Se o IP retornado por $request->getRemoteIp() for confirmado como o IP seguro do servidor proxy conhecido, então você pode obter o IP real usando $request->header('cabeçalho HTTP que contém o IP real').

Obter IP do servidor da requisição

$request->getLocalIp();

Obter porta do servidor da requisição

$request->getLocalPort();

Verificar se é uma requisição Ajax

$request->isAjax();

Verificar se é uma requisição Pjax

$request->isPjax();

Verificar se a requisição espera uma resposta em JSON

$request->expectsJson();

Verificar se o cliente aceita respostas em JSON

$request->acceptJson();

Obter o nome do plugin da requisição

Requisições não ligadas a plugins retornam uma string vazia ''.

$request->plugin;

Este recurso requer webman>=1.4.0

Obter o nome da aplicação da requisição

Em um aplicativo único, sempre retorna uma string vazia '', em aplicações múltiplas retorna o nome da aplicação.

$request->app;

Como as funções de fechamento não pertencem a nenhuma aplicação, as requisições de rotas de fechamento $request->app sempre retornam uma string vazia ''. Consulte rotas para requisitos de fechamento.

Obter o nome da classe do controlador da requisição

Obter o nome da classe correspondente ao controlador.

$request->controller;

Retorna algo semelhante a app\controller\IndexController.

Como as funções de fechamento não pertencem a nenhum controlador, as requisições de rotas de fechamento $request->controller sempre retornam uma string vazia ''. Consulte rotas para requisitos de fechamento.

Obter o nome do método da requisição

Obter o nome do método do controlador correspondente à requisição.

$request->action;

Retorna algo como index.

Como as funções de fechamento não pertencem a nenhum controlador, as requisições de rotas de fechamento $request->action sempre retornam uma string vazia ''. Consulte rotas para requisitos de fechamento.