Atributos Check
1Visão geral
1.1Atributos de validação
O Temma fornece vários atributos usados para validar dados recebidos:
- \Temma\Attributes\Check\Params: Valida os parâmetros presentes na URL.
- \Temma\Attributes\Check\Get: Valida os dados recebidos como parâmetros GET.
- \Temma\Attributes\Check\Post: Valida os dados recebidos como parâmetros POST.
- \Temma\Attributes\Check\Files: Valida os arquivos enviados.
- \Temma\Attributes\Check\Payload: Valida os dados enviados no corpo da requisição.
Esses atributos são wrappers que chamam os métodos validateParams(), validateInput(), validatePayload() e validateFiles() do objeto Request. As validações são baseadas em contratos no formato esperado pelo objeto DataFilter.
Também existe um atributo para validar dados de saída:
- \Temma\Attributes\Check\Output: Define um contrato de validação para os dados de saída, usado pela visão.
Este atributo chama o método setValidationContract() do objeto Response.
1.2Parâmetros comuns
Alguns parâmetros são comuns a todos esses atributos (exceto Output):
- $strict: (bool) Ativa o modo de validação estrita (false por padrão).
- $redirect: (string) URL para a qual redirecionar o usuário se os dados não forem válidos.
- $redirectVar: (string) Nome da variável de template contendo a URL de redirecionamento.
- $redirectReferer: (bool) true por padrão. Se true e $redirect e $redirectVar estiverem vazios, o cabeçalho HTTP REFERER é usado como URL de redirecionamento.
-
$flashVar : (string) Nome da variável flash
que conterá informações em caso de redirecionamento ('form' por padrão).
O conteúdo da variável flash depende do atributo usado (veja abaixo).
O valor padrão 'form' significa que os dados recebidos estão disponíveis em uma variável de sessão flash chamada __form. - $dataVar : (?string) Nome da variável de template que conterá os dados validados/filtrados pelo DataFilter. Isso permite recuperar os dados processados diretamente, evitando operações redundantes (por exemplo, decodificar um fluxo JSON, ou detectar o tipo MIME de dados binários). null por padrão (funcionalidade desativada). Não disponível para Files.
1.3Prioridade de redirecionamento
Quando os dados não são válidos, o atributo pode redirecionar o usuário para outra página.
Para determinar a URL de redirecionamento, a seguinte ordem de prioridade é aplicada:
- Se o parâmetro $redirect estiver definido, ele é usado.
- Se o parâmetro $redirectVar estiver definido e contiver o nome de uma variável de template existente e não vazia, seu valor é usado.
- Se o parâmetro $redirectReferer estiver definido como true, e o cabeçalho HTTP Referer existir e não estiver vazio, ele é usado.
- Se o arquivo etc/temma.php contiver uma configuração estendida x-security com uma chave redirect, seu valor é usado.
Se nenhuma URL de redirecionamento for encontrada, um erro HTTP 403 (Forbidden) é retornado.
2Params
2.1Params: visão geral
Este atributo valida os parâmetros recebidos por uma ação (ou por todas as ações de um controlador).
É um wrapper em torno do método validateParams() do objeto
Request.
2.2Params: parâmetros específicos
- $contract : (string|array) Nome do contrato definido no arquivo de configuração (veja a documentação), ou nome de um objeto de validação, ou lista de contratos (um contrato por parâmetro).
- $flashVar : (string) Nome da variável flash que conterá uma cópia dos parâmetros recebidos, caso o usuário seja redirecionado.
2.3Params: exemplos
use \Temma\Attributes\Check\Params as TµCheckParams;
/*
* Todas as ações do controlador devem ter um parâmetro do tipo "int"
* e um parâmetro do tipo "email".
*/
#[TµCheckParams(['int', 'email'])]
class Actions extends \Temma\Web\Controller {
// ...
}
use \Temma\Attributes\Check\Params as TµCheckParams;
class Actions extends \Temma\Web\Controller {
// esta ação espera um parâmetro inteiro positivo
// e uma string com até 12 caracteres
#[TµCheckParams(['int; min: 0', 'string; maxLen: 12'])]
public function doSomething(int $i, string $s) {
// ...
}
// espera um parâmetro inteiro e um endereço de e-mail,
// com o modo de validação estrita ativado, permitindo parâmetros adicionais
#[TµCheckParams(
[
'int',
'email',
'...'
],
strict: true,
)]
public function action2(int $id, string $mail, float $amount, string $name) {
// ...
}
// espera um inteiro negativo e uma string;
// em caso de erro, redireciona para '/path/to/error';
// os parâmetros recebidos são copiados para a variável flash '__getErr'
#[TµCheckParams(
['int; max: 0', 'string'],
redirect: '/path/to/error',
flashVar: 'getErr',
)]
public function action3(int $id, string $value) {
// ...
}
// espera um inteiro positivo; em caso de erro, redireciona para a URL
// contida na variável de template 'errorPage';
// os parâmetros recebidos são copiados para a variável flash
// padrão '__form'
#[TµCheckParams(
['int; min: 1'],
redirectVar: 'errorPage',
)]
public function action4(int $id) {
// ...
}
// os parâmetros devem validar o contrato chamado "deleteUserParameters"
// no arquivo de configuração, definido da seguinte forma:
// 'validationTypes' => [
// 'deleteUserParameters' => [
// 'type' => 'list',
// 'values' => [
// '=int; min: 1',
// 'hash; algo: sha256',
// 'string; minLen: 2',
// ]
// ]
// ]
#[TµCheckParams('deleteUserParameters')]
public function deleteUser(int $userId, string $checkHash, string $login) {
// ...
}
// espera um inteiro positivo e uma string;
// dados validados são armazenados na variável de template 'params'
#[TµCheckParams(
['int; min: 1', 'string; maxLen: 50'],
dataVar: 'params',
)]
public function action6(int $id, string $name) {
// $this['params'] contém os parâmetros validados/filtrados
}
}
3Get
3.1Get: visão geral
Este atributo valida os parâmetros GET recebidos por um controlador ou uma ação.
É um wrapper em torno do método validateInput() do objeto
Request.
3.2Get: parâmetros específicos
- $contract : (string|array) Nome do contrato definido no arquivo de configuração (veja a documentação), ou nome de um objeto de validação, ou array associativo cujas chaves são os nomes dos parâmetros GET, e cujos valores são os contratos de validação.
- $flashVar : (string) Nome da variável flash que conterá uma cópia dos dados GET recebidos, caso o usuário seja redirecionado.
3.3Get: exemplos
use \Temma\Attributes\Check\Get as TµCheckGet;
/*
* Todas as ações do controlador devem receber os parâmetros GET
* "id" (tipo int) e "mail" (tipo email).
*/
#[TµCheckGet([
'id' => 'int',
'mail' => 'email',
])]
class Actions extends \Temma\Web\Controller {
// ...
}
use \Temma\Attributes\Check\Get as TµCheckGet;
class Actions extends \Temma\Web\Controller {
// esta ação espera um parâmetro GET "id" (sem especificar o tipo)
#[TµCheckGet(['id'])]
public function getList() {
// ...
}
// espera um parâmetro "id" e um parâmetro "name" (string com no mínimo 3 caracteres)
// com o modo de validação estrita ativado, permitindo parâmetros adicionais
#[TµCheckGet(
[
'id',
'name' => 'string; minLen: 3; maxLen: 20',
'...'
],
strict: true,
)]
public function removeItem(int $id) {
// ...
}
// espera um 'id' inteiro e uma 'name' string opcional;
// em caso de erro, redireciona para '/path/to/error';
// os dados GET recebidos são copiados para a variável flash '__getErr'
#[TµCheckGet(
[
'id' => 'int',
'name?' => 'string',
],
redirect: '/path/to/error',
flashVar: 'getErr',
)]
public function defineItem(int $id, mixed $value) {
// ...
}
// espera um 'id' inteiro; em caso de erro, o referer HTTP não é usado;
// o redirecionamento vai para a URL definida na configuração
// (x-security.redirect);
// os dados recebidos são copiados para a variável flash padrão '__form'
#[TµCheckGet(
['id' => 'int'],
redirectReferer: false,
)]
public function showItem(int $id) {
// ...
}
// os parâmetros GET devem validar o contrato chamado "internalUserData" no
// arquivo de configuração, definido da seguinte forma:
// 'validationTypes' => [
// 'internalUserData' => [
// 'login' => 'string; minLen: 2',
// 'email' => 'email; mask: @mydomain.com$',
// 'name' => 'string; minLen: 2',
// ]
// ]
#[TµCheckGet('internalUserData')]
public function updateUser(int $userId) {
// ...
}
// espera um parâmetro 'id' (inteiro);
// dados GET validados são armazenados na variável de template 'getData'
#[TµCheckGet(
['id' => 'int; min: 1'],
dataVar: 'getData',
)]
public function getItem() {
// $this['getData'] contém os dados GET validados/filtrados
}
}
4Post
4.1Post: visão geral
Este atributo valida os parâmetros POST recebidos por um controlador ou uma ação.
É um wrapper em torno do método validateInput() do objeto
Request.
4.2Post: parâmetros específicos
- $contract : (string|array) Nome do contrato definido no arquivo de configuração (veja a documentação), ou nome de um objeto de validação, ou array associativo cujas chaves são os nomes dos parâmetros POST, e cujos valores são os contratos de validação.
- $flashVar : (string) Nome da variável flash que conterá uma cópia dos dados POST recebidos, caso o usuário seja redirecionado.
4.3Post: exemplos
use \Temma\Attributes\Check\Post as TµCheckPost;
/*
* Todas as ações do controlador devem receber os parâmetros POST
* "id" (tipo int) e "mail" (tipo email).
*/
#[TµCheckPost([
'id' => 'int',
'mail' => 'email',
])]
class Actions extends \Temma\Web\Controller {
// ...
}
use \Temma\Attributes\Check\Post as TµCheckPost;
class Actions extends \Temma\Web\Controller {
// esta ação espera um parâmetro POST "id" (sem especificar o tipo)
#[TµCheckPost(['id'])]
public function getList() {
// ...
}
// espera um parâmetro "id" e um parâmetro "name" (string com no mínimo 3 caracteres)
#[TµCheckPost([
'id',
'name' => 'string; minLen: 3'
])]
public function removeItem(int $id) {
// ...
}
// espera um 'id' inteiro; em caso de erro, redireciona para '/path/to/error';
// os dados POST recebidos são copiados para a variável flash '__postErr'
#[TµCheckPost(
['id' => 'int'],
redirect: '/path/to/error',
flashVar: 'postErr',
)]
public function defineItem(int $id, mixed $value) {
// ...
}
// espera um 'id' inteiro e uma string 'name';
// em caso de erro, redireciona para a URL contida na
// variável de template 'formErrorUrl'; nenhuma variável flash é definida
#[TµCheckPost(
[
'id' => 'int',
'name' => 'string',
],
redirectVar: 'formErrorUrl',
flashVar: null,
)]
public function createItem(int $id, string $name) {
// ...
}
// os parâmetros POST devem validar o contrato chamado "itemData" no
// arquivo de configuração, definido da seguinte forma:
// 'validationTypes' => [
// 'itemData' => [
// 'code' => 'ean',
// 'dateCreation' => 'email; mask: @mydomain.com$',
// 'name' => 'string; minLen: 2',
// ]
// ]
#[TµCheckPost('itemData')]
public function updateItem(int $itemId) {
// ...
}
// espera os parâmetros POST 'email' e 'name';
// dados POST validados são armazenados na variável de template 'postData'
#[TµCheckPost(
[
'email' => 'email',
'name' => 'string; minLen: 2',
],
dataVar: 'postData',
)]
public function createUser() {
// $this['postData'] contém os dados POST validados/filtrados
}
}
5Files
5.1Files: visão geral
Este atributo valida os arquivos recebidos por um controlador ou uma ação.
É um wrapper em torno do método validateFiles() do objeto
Request.
5.2Files: parâmetros específicos
- $contract : (array) Array associativo cujas chaves são os nomes dos arquivos, e cujos valores são os contratos de validação.
- $flashVar : (string) Nome da variável flash que conterá uma cópia dos dados recebidos na superglobal $_FILES, caso o usuário seja redirecionado.
5.3Files: exemplos
use \Temma\Attributes\Check\Files as TµCheckFiles;
class Actions extends \Temma\Web\Controller {
// esta ação espera um arquivo "id_card" (sem outras restrições)
#[TµCheckFiles(['id_card'])]
public function uploadId() {
// ...
}
// espera um arquivo "picto" (imagem GIF ou PNG) e um arquivo opcional "avatar" (PDF ou imagem)
#[TµCheckFiles([
'picto' => 'binary; mime: image/gif, image/png',
'avatar?' => 'binary; mime: application/pdf, image'
])]
public function createUser() {
// ...
}
}
6Payload
6.1Payload: visão geral
Este atributo valida o conteúdo do corpo da requisição ("payload") recebido por um controlador ou uma ação.
É um wrapper em torno do método validatePayload() do objeto
Request.
6.2Payload: parâmetros específicos
- $contract : (string|array) Nome do contrato definido no arquivo de configuração (veja a documentação), ou nome do objeto de validação, ou contrato de validação.
- $flashVar : (string) Nome da variável flash que conterá o valor booleano true, caso o usuário seja redirecionado.
6.3Payload: exemplos
use \Temma\Attributes\Check\Payload as TµCheckPayload;
class Actions extends \Temma\Web\Controller {
// esta ação espera um payload contendo um fluxo JSON (sem outras restrições)
#[TµCheckPayload('json')]
public function getStream() {
// ...
}
// espera um fluxo JSON contendo uma lista de inteiros
#[TµCheckPayload([
'type' => 'json',
'contract' => 'list; contract: int'
])]
public function removeItems() {
// ...
}
// espera uma imagem codificada em base64
#[TµCheckPayload('base64; mime: image')]
public function uploadAvatar(int $id) {
// ...
}
// espera um fluxo JSON contendo um array associativo
// com chaves definidas e tipadas, usando validação estrita;
// em caso de erro, redireciona para '/path/to/error';
// a variável flash '__postErr' é definida como true
#[TµCheckPayload(
[
'type' => 'json',
'contract' => [
'type' => 'assoc',
'keys' => [
'id' => 'int',
'name' => 'string',
'role' => 'enum; values: user, member, admin',
],
],
],
redirect: '/path/to/error',
flashVar: 'postErr',
)]
public function uploadUserList() {
// ...
}
// o payload deve validar o contrato chamado "internalUserJson" no
// arquivo de configuração, definido da seguinte forma:
// 'validationTypes' => [
// 'internalUserJson' => [
// 'type' => 'json',
// 'contract' => [
// 'type' => 'assoc',
// 'keys' => [
// 'login' => 'string; minLen: 2',
// 'email' => 'email; mask: @mydomain.com$',
// 'name' => 'string; minLen: 2',
// ]
// ]
// ]
// ]
#[TµCheckPayload('internalUserJson')]
public function updateUserData(int $userId) {
// ...
}
// espera um fluxo JSON contendo um array associativo;
// dados validados são armazenados na variável de template 'jsonData'
#[TµCheckPayload(
[
'type' => 'json',
'contract' => [
'type' => 'assoc',
'keys' => [
'id' => 'int',
'name' => 'string',
],
],
],
dataVar: 'jsonData',
)]
public function importData() {
// $this['jsonData'] contém os dados JSON decodificados e validados
}
}
7Output
7.1Output: visão geral
Este atributo define um contrato de validação para os dados de saída (variáveis de template)
de um controlador ou uma ação.
É um wrapper em torno do método setValidationContract() do objeto
Response.
O contrato definido pode ser usado pela visão para validar os dados antes de enviá-los ao navegador.
Ao contrário dos outros atributos Check, este atributo não suporta os parâmetros comuns ($strict, $redirect, $redirectVar, $flashVar).
7.2Output: parâmetros específicos
- $contract : (null|string|array) Nome do contrato definido no arquivo de configuração (veja a documentação), ou nome de um objeto de validação, ou contrato de validação (veja o objeto DataFilter), ou null para remover um contrato definido anteriormente.
7.3Output: exemplos
use \Temma\Attributes\Check\Output as TµCheckOutput;
/*
* Todas as ações do controlador devem fornecer uma variável de template "name" (string)
* e uma variável "mail" (email).
*/
#[TµCheckOutput([
'name' => 'string',
'mail' => 'email',
])]
class Actions extends \Temma\Web\Controller {
// ...
}
use \Temma\Attributes\Check\Output as TµCheckOutput;
class Actions extends \Temma\Web\Controller {
// verifica se a variável de template "id" é um inteiro
// entre 5 e 128, com validação estrita
#[TµCheckOutput(['=id' => 'int; min: 5; max: 128'])]
public function showItem() {
// ...
}
// verifica uma variável "name" (string), uma variável "mail" (email),
// e uma variável opcional "balance" (float)
#[TµCheckOutput([
'name' => 'string',
'mail' => 'email',
'balance?' => 'float',
])]
public function showUser() {
// ...
}
// os dados de saída devem validar o contrato chamado "userData"
// no arquivo de configuração, definido da seguinte forma:
// 'validationTypes' => [
// 'userData' => [
// 'id' => 'int',
// 'login' => 'string; minLen: 2',
// 'email' => 'email',
// ]
// ]
#[TµCheckOutput('userData')]
public function getUser(int $userId) {
// ...
}
}