tenqz / shortify
🚀 Lightweight PHP library to shorten URLs effortlessly. Convert long links into short, memorable ones with zero dependencies. Perfect for APIs, custom shorteners, and frameworks like Laravel/Symfony.
v1.1.2
2025-05-08 18:04 UTC
Requires
- php: ^8.3
Requires (Dev)
- phpunit/phpunit: ^12.0
- squizlabs/php_codesniffer: ^3.7
This package is auto-updated.
Last update: 2025-05-08 18:05:13 UTC
README
Shortify
🚀 Lightweight PHP 8.3+ library for URL shortening that follows SOLID and DDD principles.
Requirements
- PHP 8.3 or higher
- Composer
Installation
composer require tenqz/shortify
Features
- PHP 8.3+
- PSR-12 compliant
- SOLID/DDD: clear layer separation, ValueObject, Dependency Injection
- TDD: code covered with tests
- Minimalistic and clean code (KISS/DRY)
Usage
Basic Usage
<?php use Tenqz\Shortify\Shortify; use Tenqz\Shortify\Infrastructure\Repository\UrlRepositoryInterface; // 1. Create your implementation of UrlRepositoryInterface class YourRepository implements UrlRepositoryInterface { // Implement save, findByCode, exists methods } // 2. Create a Shortify instance with your repository $repository = new YourRepository(); $shortify = new Shortify($repository); // 3. Shorten a URL try { $url = $shortify->shorten('https://example.com/very-long-url'); echo "Short code: " . $url->getShortCode(); // For example "xB4p2q" } catch (\Tenqz\Shortify\Exceptions\InvalidUrlException $e) { echo "Error: " . $e->getMessage(); } // 4. Get the original URL from the code try { $originalUrl = $shortify->expand('xB4p2q'); echo "Original URL: " . $originalUrl; } catch (\Tenqz\Shortify\Exceptions\UrlNotFoundException $e) { echo "Error: " . $e->getMessage(); }
Creating Your Own Repository
The library doesn't provide specific repository implementations, which allows you to create your own implementations for various data stores. Here's an example of a simple in-memory implementation:
<?php use Tenqz\Shortify\Infrastructure\Repository\UrlRepositoryInterface; use Tenqz\Shortify\Core\Url; class InMemoryUrlRepository implements UrlRepositoryInterface { private array $urls = []; public function save(Url $url): void { $code = $url->getShortCode(); if ($code !== null) { $this->urls[$code] = $url; } } public function findByCode(string $code): ?Url { return $this->urls[$code] ?? null; } public function exists(string $code): bool { return isset($this->urls[$code]); } }
Architecture
The library is built according to Domain-Driven Design (DDD) principles and is divided into the following layers:
Core (Domain)
Url.php
- URL ValueObject with validationShortener.php
- Main URL shortening logicCodeGenerator.php
- Unique code generator
Infrastructure
UrlRepositoryInterface.php
- Repository interface for URL storage
Exceptions
InvalidUrlException.php
- Exception for invalid URLsUrlNotFoundException.php
- Exception when a URL with the given code is not found
Shortify (Facade)
Shortify.php
- Facade for convenient library usage
Testing
composer test
License
MIT