develia / commons
Common utility library
Requires
- php: >=8.1
- ext-json: *
- ext-mbstring: *
- ext-simplexml: *
Requires (Dev)
- phpstan/phpstan: 2.2.x-dev
- phpstan/phpstan-strict-rules: 2.0.x-dev
- phpunit/phpunit: *
Suggests
- ext-ctype: *
- ext-http: *
- ext-openssl: *
Provides
None
Conflicts
None
Replaces
None
- dev-master
- 0.9.9
- 0.9.8
- 0.9.7
- 0.9.6
- 0.9.5
- 0.9.4
- 0.9.3
- 0.9.2
- 0.9.1
- 0.9.0
- 0.8.55
- 0.8.54
- 0.8.53
- 0.8.52
- 0.8.51
- 0.8.50
- 0.8.49
- 0.8.48
- 0.8.47
- 0.8.46
- 0.8.45
- 0.8.44
- 0.8.43
- 0.8.42
- 0.8.41
- 0.8.40
- 0.8.39
- 0.8.38
- 0.8.37
- 0.8.36
- 0.8.35
- 0.8.34
- 0.8.33
- 0.8.32
- 0.8.31
- 0.8.30
- 0.8.29
- 0.8.28
- 0.8.27
- 0.8.26
- 0.8.25
- 0.8.24
- 0.8.23
- 0.8.22
- 0.8.21
- 0.8.20
- 0.8.19
- 0.8.18
- 0.8.17
- 0.8.16
- 0.8.15
- 0.8.14
- 0.8.13
- 0.8.12
- 0.8.11
- 0.8.10
- 0.8.9
- 0.8.8
- 0.8.7
- 0.8.6
- 0.8.5
- 0.8.4
- 0.8.3
- 0.8.2
- 0.8.1
- 0.8.0
- 0.7.34
- 0.7.33
- 0.7.32
- 0.7.30
- 0.7.29
- 0.7.28
- 0.7.27
- 0.7.26
- 0.7.25
- 0.7.24
- 0.7.23
- 0.7.22
- 0.7.21
- 0.7.20
- 0.7.19
- 0.7.18
- 0.7.17
- 0.7.16
- 0.7.15
- 0.7.14
- 0.7.13
- 0.7.12
- 0.7.11
- 0.7.10
- 0.7.9
- 0.7.8
- 0.7.7
- 0.7.6
- 0.7.5
- 0.7.4
- 0.7.3
- 0.7.2
- 0.7.1
- 0.7.0
- 0.6.6
- 0.6.5
- 0.6.4
- 0.6.3
- 0.6.2
- 0.6.1
- 0.6.0
- 0.5.6
- 0.5.5
- 0.5.4
- 0.5.3
- 0.5.2
- 0.5.1
- 0.5.0
- 0.4.6
- 0.4.5
- 0.4.4
- 0.4.3
- 0.4.2
- 0.4.1
- 0.4.0
- 0.3.53
- 0.3.40
- 0.3.39
- 0.3.6
- 0.3.4
- 0.3.3
- 0.3.2
- 0.3.1
- 0.3.0
- 0.2.51
- 0.2.50
- 0.2.49
- 0.2.48
- 0.2.47
- 0.2.46
- 0.2.45
- 0.2.44
- 0.2.43
- 0.2.42
- 0.2.41
- 0.2.40
- 0.2.39
- 0.2.38
- 0.2.36
- 0.2.35
- 0.2.34
- 0.2.33
- 0.2.32
- 0.2.31
- 0.2.30
- 0.2.29
- 0.2.28
- 0.2.27
- 0.2.26
- 0.2.25
- 0.2.24
- 0.2.23
- 0.2.22
- 0.2.21
- 0.2.20
- 0.2.19
- 0.2.18
- 0.2.17
- 0.2.16
- 0.2.13
- 0.2.12
- 0.2.11
- 0.2.10
- 0.2.9
- 0.2.8
- 0.2.7
- 0.2.6
- 0.2.5
- 0.2.4
- 0.2.2
- 0.2.1
- 0.2.0
- 0.1.42
- 0.1.41
- 0.1.40
- 0.1.39
- 0.1.38
- 0.1.37
- 0.1.36
- 0.1.35
- 0.1.34
- 0.1.33
- 0.1.31
- 0.1.29
- 0.1.28
- 0.1.27
- dev-php-5.6
This package is auto-updated.
Last update: 2026-09-18 09:03:02 UTC
README
Biblioteca de utilidades de bajo nivel para PHP (>= 8.2) que extiende el lenguaje con una sintaxis más moderna y robusta: colecciones (estilo LINQ), IO, web/HTTP, reflexión, fechas, matemáticas, paralelización y utilidades generales.
- Namespace raíz:
Develia\(PSR-4, mapeado asrc/). - Extensiones requeridas:
mbstring,json,simplexml.
Instalación
composer require develia/commons
La librería incluye su propio autoloader (src/autoload.php) y es compatible con
el autoloading de Composer.
Patrones de diseño
- Try-Parse (inspirado en .NET): métodos
tryX(..., &$output): boolque evitan excepciones y permiten control de flujo basado en booleanos (Str,Date,RequestPayload,From,Util). Colecciones fluidas (LINQ style):
Develia\Fromes el núcleo del procesamiento de datos:from($array)->filter(...)->map(...)->toArray();Abstracción de entorno:
ParallelizeryOSadaptan la librería al sistema operativo y a las extensiones disponibles (Swoole, Amp, ReactPHP).
Mapa de utilidades
From— operaciones de colecciones (filter/map/reduce/join/distinct/sortBy…).Obj— utilidades exclusivas de objetos y clases: reflexión,toArray(objeto → array),getTraits/getInterfaces/getClass/getParentClass,isA/isSubclassOf/instantiate.Util— utilidades de propósito general (no exclusivas de objetos): comprobaciones de tipo (isString,isArray,isObject,isNullOrEmpty,isIterable…), conversiones (toInt,toString,toFloat,toBoolean), clonación de cualquier valor (clone), acceso dinámico a elementos/propiedades de arrays u objetos (get/set/tryGet/trySet/assign),fromArray(array →stdClass), y helpers comoclamp,compare,swap,hash,isBetweenyrepeat.Str/Date/Math— utilidades de cadenas, fechas y matemáticas.IO\StreamyIO/— sistema de archivos y streams orientado a objetos.Request/RequestPayload/Response/UploadedFile— capa HTTP.Reflector/ClassInfo— introspección de clases, interfaces y traits.Assert— precondiciones fail-fast con estrechamiento estático, composición y errores estructurados.
Obj vs Util
Obj agrupa únicamente las utilidades que operan exclusivamente sobre objetos y
clases, mientras que las utilidades genéricas viven en Util:
use Develia\Obj;
use Develia\Util;
// Objetos/clases -> Obj
$data = Obj::toArray($entity);
$traits = Obj::getTraits($entity);
// Propósito general -> Util
if (Util::isString($value)) { /* ... */ }
$copy = Util::clone($entity, true);
$n = Util::clamp($n, 0, 100);
Aserciones fail-fast
Assert valida precondiciones sin acumular errores ni sustituir a un sistema de
validación de formularios. Sus guardas de tipo estrechan valores en PHPStan y
Psalm; nullOr() y all() componen una única regla, deteniéndose en el primer
incumplimiento:
use Develia\Assert;
Assert::nullOr($alias, static fn(mixed $value) => Assert::isString($value));
Assert::all($roles, static fn(mixed $role) => Assert::isNotEmptyString($role));
$name = Assert::value($input, 'user.name')
->isString()
->isNotEmptyString()
->getValue();
Los fallos lanzan Develia\Exceptions\AssertionException, compatible con
InvalidArgumentException, e incluyen el valor rechazado, la restricción y la
ruta de propiedad opcional mediante sus accesores.
Solicitudes HTTP y método QUERY
Request::getPayload() distingue entre métodos que solo consultan la URL
(GET, DELETE, HEAD y OPTIONS) y métodos con contenido. QUERY se trata
como un método seguro e idempotente con cuerpo y admite JSON, XML, CSV, texto,
application/x-www-form-urlencoded y multipart/form-data:
Request::getContentType() devuelve el media type normalizado y sin parámetros;
Request::getHeader() resuelve nombres sin distinguir mayúsculas/minúsculas.
Headers, tipo de contenido y body se capturan de forma diferida una sola vez por
instancia.
use Develia\Request;
use Develia\RequestPayload;
$request = Request::current();
$payload = $request->getPayload();
if ($payload instanceof RequestPayload && $payload->has('xxxxx')) {
$explicitamenteVacio = $payload->isEmpty('xxxxx');
$valor = $payload->getString('xxxxx');
}
Request::getQuery() devuelve siempre un RequestPayload. Para métodos distintos
de QUERY representa únicamente el query string de la URL. Para QUERY exige un
Content-Type válido y combina los parámetros de la URL con un body JSON
estructurado, URL-encoded o multipart. La combinación es superficial: una clave
del body sustituye por completo la misma clave de la URL.
Por ejemplo, una petición QUERY /documents?scope=public&filter[status]=draft
con body JSON {"filter":{"status":"published"},"limit":20} produce scope,
filter y limit, pero filter contiene solo el árbol enviado en el body:
$query = Request::current()->getQuery();
$scope = $query->getString('scope');
$filter = $query->getArray('filter');
$limit = $query->getInt('limit');
$document = $query->getFile('document'); // Disponible con multipart/form-data.
XML, CSV, texto y tipos de medio desconocidos continúan disponibles mediante
getPayload(), pero getQuery() los rechaza porque no existe una conversión
inequívoca a pares clave/valor. Los archivos de un body multipart se conservan
como UploadedFile en el payload combinado.
La presencia y el contenido se consultan por separado. Para xxxxx=&yyyy=2,
has('xxxxx') e isEmpty('xxxxx') devuelven true; si solo se envía
yyyy=2, ambos devuelven false. null, '' y [] son valores vacíos, pero
0, '0', false y los espacios no lo son.
RequestPayload conserva un snapshot de arrays por valor, accesible mediante
getData(), y otro de archivos mediante getFiles(). Sus archivos deben estar
normalizados como UploadedFile; no acepta objetos de datos ni registros
$_FILES sin adaptar:
use Develia\RequestPayload;
use Develia\UploadedFile;
$file = UploadedFile::createFromPhpUpload($_FILES['document']);
$payload = new RequestPayload($_POST, ['document' => $file]);
RequestPayload::merge($first, $second, ...) combina datos y archivos por
separado; en claves repetidas prevalece el último payload.
Para archivos creados al procesar un cuerpo multipart manualmente se usa
UploadedFile::createFromTemporaryFile(). El antiguo constructor público de
UploadedFile y Request::parse(&$form, &$files) se han eliminado; usa
Request::getForm() y los accesores del payload. Los argumentos nombrados
thousands_separator y decimals_separator pasan a llamarse
thousandsSeparator y decimalsSeparator.
Tests
vendor/bin/phpunit test