abduns / qrcode
A from-scratch, framework-agnostic QR Code generator for PHP 8.2+ with zero required runtime dependencies.
v1.1.3
2026-05-17 12:47 UTC
Requires
- php: ^8.2
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.64
- pestphp/pest: ^3.0
- phpstan/phpstan: ^2.0
Suggests
- ext-gd: Required for the GD-backed PNG renderer.
README
A from-scratch, framework-agnostic QR Code generator for PHP 8.2+ with zero required runtime dependencies.
Features
- Modern PHP support
- Lightweight and fast
- Typed API
- Framework agnostic
- Standards-oriented
- Extensible architecture
- Zero runtime dependencies
- Three renderers (SVG, PNG, Console)
- ISO/IEC 18004 compliant
- Payload helpers (URL, vCard, Event, etc.)
Installation
composer require abduns/qrcode
Quick Start
use Dunn\QrCode\QrCode; use Dunn\QrCode\EccLevel; use Dunn\QrCode\Renderer\Svg\SvgRenderer; $qr = QrCode::create('https://example.com') ->errorCorrection(EccLevel::Quartile) ->build(); $svg = (new SvgRenderer(size: 300, margin: 4))->render($qr); file_put_contents('qr.svg', $svg);
Why This Package?
- Existing solutions are outdated
- Missing modern PHP features
- Poor developer experience
- No standards compliance
- Too framework-coupled
This package focuses on simplicity, interoperability, and modern developer ergonomics.
Usage
Basic Usage
use Dunn\QrCode\QrCode; // Payload helpers QrCode::url('https://example.com')->build(); QrCode::text('hello')->build(); QrCode::phone('+14155550123')->build(); QrCode::sms('+14155550123', body: 'hi')->build(); QrCode::email('a@b.com', subject: 'hello', body: 'hi')->build(); QrCode::geo(37.7749, -122.4194, label: 'SF')->build();
Advanced Usage
use Dunn\QrCode\Renderer\Svg\SvgRenderer; use Dunn\QrCode\Style\Color; use Dunn\QrCode\Style\Logo; use Dunn\QrCode\Style\ModuleShape\DotModule; use Dunn\QrCode\Style\EyeStyle\CircleEyeOuter; use Dunn\QrCode\Style\EyeStyle\SquareEyeInner; $renderer = new SvgRenderer( size: 360, margin: 4, background: Color::hex('#fafafa'), // Data dots: round, dark navy. moduleShape: new DotModule(), dotColor: Color::hex('#264653'), // Marker outer ring: round, teal. eyeOuter: new CircleEyeOuter(), markerOuterColor: Color::hex('#2a9d8f'), // Marker inner pupil: square, terracotta. eyeInner: new SquareEyeInner(), markerInnerColor: Color::hex('#e76f51'), // Optional center logo logo: Logo::fromFile(__DIR__ . '/logo.png', sizeRatio: 0.18), ); $svg = $renderer->render($qr);
Configuration
All renderers are highly configurable directly via their constructors.
use Dunn\QrCode\Renderer\Png\GdPngRenderer; use Dunn\QrCode\Renderer\Console\ConsoleRenderer; $png = (new GdPngRenderer(size: 300))->render($qr); echo (new ConsoleRenderer(margin: 2))->render($qr);
Standards / Specifications
- ISO/IEC 18004
- RFC 3966 (tel)
- RFC 6068 (mailto)
- RFC 5870 (geo)
References:
Supported Features
| Feature | Support |
|---|---|
| SVG Renderer | ✅ |
| PNG Renderer | ✅ |
| Console Renderer | ✅ |
| Custom Colors & Gradients | ✅ |
| Custom Logos | ✅ |
Compatibility
| Platform | Supported |
|---|---|
| PHP 8.2+ | ✅ |
| Laravel | ✅ (via laravel-qrcode) |
Design Goals
- Developer experience first
- Predictable APIs
- Minimal dependencies
- Strong typing
- Extensibility
- Interoperability
- Byte-exact ISO/IEC 18004 compliance
Architecture
- immutable objects
- independent encoding logic
- rendering adapters
Performance
| Operation | Time |
|---|---|
| Parse & Encode | 2ms |
| Serialize SVG | 1ms |
Testing
composer test
Roadmap
- Kanji mode
- Micro QR
- Structured Append
Contributing
Contributions, issues, and discussions are welcome.
Security
If you discover security issues, please report them responsibly.
License
MIT