PHPackages                             richard-roman/short-links-qr - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. richard-roman/short-links-qr

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

richard-roman/short-links-qr
============================

Short links and QR codes for Laravel applications

v1.2.0(1mo ago)00MITPHP ^8.3

Since Jun 21Compare

[ Source](https://github.com/Richard-Roman/short-links-qr)[ Packagist](https://packagist.org/packages/richard-roman/short-links-qr)[ Docs](https://github.com/Richard-Roman/short-links-qr)[ RSS](/packages/richard-roman-short-links-qr/feed)WikiDiscussions Synced 2w ago

READMEChangelogDependencies (8)Versions (6)Used By (0)

richard-roman/short-links-qr
============================

[](#richard-romanshort-links-qr)

Paquete Composer de short links + códigos QR para aplicaciones Laravel.

**Versión:** 1.2.0
**Requisitos:** PHP ^8.3, Laravel ^11|^12|^13
**Repositorio:** [github.com/Richard-Roman/short-links-qr](https://github.com/Richard-Roman/short-links-qr)
**Packagist:** [packagist.org/packages/richard-roman/short-links-qr](https://packagist.org/packages/richard-roman/short-links-qr)

Instalación
-----------

[](#instalación)

### Packagist (recomendado)

[](#packagist-recomendado)

```
composer require richard-roman/short-links-qr:^1.2
composer require endroid/qr-code:^6.0
```

### VCS (sin Packagist)

[](#vcs-sin-packagist)

```
{
    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/Richard-Roman/short-links-qr"
        }
    ],
    "require": {
        "richard-roman/short-links-qr": "^1.2",
        "endroid/qr-code": "^6.0"
    }
}
```

El paquete se auto-descubre vía `ShortLinksServiceProvider`. Ejecutar migraciones:

```
php artisan migrate
```

### Configuración (opcional)

[](#configuración-opcional)

```
php artisan vendor:publish --tag=short-links-config
```

Claves principales en `config/short-links.php`:

ClaveDefaultDescripción`route_prefix``l`Prefijo de rutas públicas`qr_generator``RichardRoman\ShortLinks\Laravel\Qr\EndroidQrGenerator::class`Clase del generador de QR a resolver desde el contenedor`throttle``120,1`Rate limit redirect/QR`cache.ttl``3600`TTL cache de URL resuelta (seg)`cache.prefix``short_link_redirect:`Prefijo clave cache`generator.length``8`Longitud de códigos auto-generados`generator.charset`charset sin ambiguosCaracteres del generador aleatorio`route_pattern``[a-hjkmnp-z2-9]{8}`Regex Laravel `where()` + validación de códigosVariables de entorno opcionales: `SHORT_LINKS_LENGTH`, `SHORT_LINKS_CHARSET`, `SHORT_LINKS_ROUTE_PATTERN`.

v1.1.0 — Códigos configurables y manuales
-----------------------------------------

[](#v110--códigos-configurables-y-manuales)

Actualización **semver minor** compatible con v1.0: sin overrides en `.env`, el comportamiento es idéntico a 1.0.0.

### Código manual opcional

[](#código-manual-opcional)

```
$shortLink = ShortLinks::create(
    urlDestino: 'https://example.com/recurso',
    titulo: 'Demo',
    codigo: 'K7MNP2WX', // normalizado a minúsculas; debe cumplir route_pattern
);
```

Si el código no cumple `route_pattern`, se lanza `InvalidCodeFormatException`. Si ya existe, `DuplicateCodeException` sin reintentos aleatorios.

### Personalizar generador y patrón de ruta

[](#personalizar-generador-y-patrón-de-ruta)

```
SHORT_LINKS_LENGTH=5
SHORT_LINKS_CHARSET=abc
SHORT_LINKS_ROUTE_PATTERN=[abc]{5}
```

El generador y las rutas públicas MUST usar el mismo `route_pattern`.

### Actualizar desde v1.1

[](#actualizar-desde-v11)

```
composer require richard-roman/short-links-qr:^1.2
```

> No requiere migraciones nuevas. Ver [CHANGELOG.md](CHANGELOG.md) para el detalle completo.

v1.2.0 — Gestión del ciclo de vida de enlaces
---------------------------------------------

[](#v120--gestión-del-ciclo-de-vida-de-enlaces)

Actualización **semver minor** compatible con v1.1: sin cambios en `.env` ni migraciones.

### Redirección asíncrona

[](#redirección-asíncrona)

El registro de clicks ya no bloquea el response HTTP. Se despacha en background vía `ProcessShortLinkClickJob`. Requerís un driver de cola configurado:

```
QUEUE_CONNECTION=database  # o redis, sqs, etc.
```

### Desactivar un enlace

[](#desactivar-un-enlace)

```
// Marca el link como inactivo e invalida su caché de redirección.
ShortLinks::deactivate('k7mn2wxp');

// A partir de este momento GET /l/k7mn2wxp retorna 404.
```

### Rotación atómica de enlace

[](#rotación-atómica-de-enlace)

Desactiva el viejo y crea el nuevo en una única transacción de base de datos. Si la creación del nuevo falla, el viejo permanece activo (rollback automático).

```
// Rotación con código auto-generado
$nuevoLink = ShortLinks::rotate('codigo-viejo');

// Rotación con código manual
$nuevoLink = ShortLinks::rotate('codigo-viejo', 'codigo-nuevo');

// El nuevo link hereda: urlDestino, entidadTipo, entidadId, titulo, creadoPorId
echo $nuevoLink->codigo; // "codigo-nuevo"
```

Si el código viejo no existe o está inactivo, lanza `ShortLinkNotFoundException`.

Uso básico
----------

[](#uso-básico)

### Crear short links (Facade)

[](#crear-short-links-facade)

```
use RichardRoman\ShortLinks\Laravel\Facades\ShortLinks;

$shortLink = ShortLinks::create(
    urlDestino: 'https://www.youtube.com/watch?v=abc123',
    titulo: 'Video demo',
    entidadTipo: 'entregable',
    entidadId: $entregableId,
    creadoPorId: auth()->id(),
);

$existente = ShortLinks::findByEntity('entregable', $entregableId);
```

### Rutas públicas (auto-registradas)

[](#rutas-públicas-auto-registradas)

- `GET /l/{codigo}` → redirect 302 seguro + analytics
- `GET /l/{codigo}/qr` → PNG 300×300 del short URL

Nombres de ruta: `short-links.redirect`, `short-links.qr`.

**Importante:** registrar el ServiceProvider antes de rutas catch-all del host (p. ej. `/blog`).

### Entity resolvers (host)

[](#entity-resolvers-host)

El paquete no conoce modelos de la app. Registrar resolvers en `AppServiceProvider::boot()`:

```
use App\ShortLinks\Resolvers\EntregableEntityResolver;
use App\ShortLinks\Resolvers\ProyectoEntityResolver;

$this->app->tag([
    ProyectoEntityResolver::class,
    EntregableEntityResolver::class,
], 'short-links.entity-resolvers');
```

Cada resolver implementa `RichardRoman\ShortLinks\Contracts\EntityResolverInterface`:

```
public function supports(string $entidadTipo): bool;
public function resolveUrl(string $entidadId): ?string;
```

### Cache de redirect

[](#cache-de-redirect)

Tras resolver la URL (resolver host o `url_destino`), se cachea por `codigo`. La cache se invalida al desactivar un link.

### QR

[](#qr)

Requiere `endroid/qr-code` en el proyecto consumidor. Sin la dependencia, `GET /l/{codigo}/qr` responde 503.

Ejemplo multi-app
-----------------

[](#ejemplo-multi-app)

App A (app-web): resolvers `producto`, `factura`, `entregable`.
App B (blog): resolver `articulo` opcional; links externos solo con `url_destino`.

Misma instalación Composer; distintos resolvers taggeados por host.

Desarrollo local
----------------

[](#desarrollo-local)

```
git clone https://github.com/Richard-Roman/short-links-qr.git
cd short-links-qr
composer install
composer validate --strict
composer test
```

### Path repository (monorepo dev)

[](#path-repository-monorepo-dev)

```
{
    "repositories": [
        {
            "type": "path",
            "url": "../short-links-qr",
            "options": { "symlink": true }
        }
    ],
    "require": {
        "richard-roman/short-links-qr": "@dev"
    }
}
```

Estructura
----------

[](#estructura)

```
src/Contracts/     ← interfaces
src/Core/          ← PHP (servicios, VOs, validación)
src/Laravel/       ← Eloquent, rutas, Facade, QR endroid
tests/Unit/        ← tests
tests/Feature/     ← Orchestra Testbench

```

Licencia
--------

[](#licencia)

MIT — ver [LICENSE](LICENSE).

###  Health Score

39

—

LowBetter than 84% of packages

Maintenance91

Actively maintained with recent releases

Popularity0

Limited adoption so far

Community2

Small or concentrated contributor base

Maturity52

Maturing project, gaining track record

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~1 days

Total

5

Last Release

41d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/76d7af680d58b999ca253ebe6ab7cb88c5e3d0c75bed17e68cbdf99d3f9de15b?d=identicon)[Richard-Roman](/maintainers/Richard-Roman)

---

Tags

qr codelaravelredirecturl shortenershort-links

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/richard-roman-short-links-qr/health.svg)

```
[![Health](https://phpackages.com/badges/richard-roman-short-links-qr/health.svg)](https://phpackages.com/packages/richard-roman-short-links-qr)
```

###  Alternatives

[leantime/leantime

Open source project management system for non-project managers. Simple like Trello, powerful like Jira. Built with neurodiversity in mind.

10.2k4.0k](/packages/leantime-leantime)[nativephp/mobile

NativePHP for Mobile

1.1k102.1k123](/packages/nativephp-mobile)[markwalet/nova-modal-response

A Laravel Nova asset for Modal responses on an action.

17930.8k](/packages/markwalet-nova-modal-response)[ronasit/laravel-helpers

Provided helpers function and some helper class.

2087.0k31](/packages/ronasit-laravel-helpers)[team-nifty-gmbh/tall-datatables

Server-side rendered datatables for Laravel and Livewire

1422.0k5](/packages/team-nifty-gmbh-tall-datatables)[ecotone/laravel

Ecotone for Laravel — CQRS, Event Sourcing, Sagas, Durable Workflows, and Outbox on top of Laravel Queue, via PHP attributes.

21327.3k4](/packages/ecotone-laravel)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
