jamal/laravel-qrcode

Dependency-free Laravel QR Code generator with pure-PHP SVG renderer and optional GD/Imagick PNG.

v1.0.4 2025-09-16 21:13 UTC

This package is auto-updated.

Last update: 2025-09-16 21:16:46 UTC


README

A dependency-free Laravel QR Code generator with a pure-PHP SVG renderer and optional PNG via GD/Imagick.

Standards Compliance

  • Implements ISO/IEC 18004 core rules for Versions 1–40.
  • Modes: Numeric, Alphanumeric, Byte (UTF‑8).
  • Error correction: L, M, Q, H via Reed–Solomon over GF(256).
  • Masking: evaluates masks 0–7 and selects the lowest-penalty matrix.
  • Proper function patterns (finder, separators, timing, alignment where applicable), format bits, and data placement.
  • Quiet zone default is 4 modules (configurable via margin).

Note: If you need Versions 5–40, extend Version tables for EC block structure and alignment centers. The encoder is structured to allow this without changing the public API.

Installation

composer require jamal/laravel-qrcode
php artisan vendor:publish --tag=config --provider="Jamal\QrCode\QrCodeServiceProvider"

Quick Start

use QrCode;

echo QrCode::text('Hello World')->renderer('svg')->toSvg();

Examples

1) SVG and PNG

QrCode::text('Hello')->toSvg();
QrCode::text('Hello')->renderer('gd')->toPng();

2) Save to file

QrCode::text('Save')->renderer('svg')->save(storage_path('app/qr.svg'));
QrCode::text('Save')->renderer('gd')->save(storage_path('app/qr.png'));

3) Controller Response

return QrCode::text('Hello')->toSvgResponse();
// or
return QrCode::text('Hello')->renderer('gd')->toPngResponse();

4) Data URI

$uri = QrCode::text('Embed')->toDataUri('svg'); // or 'png'

5) Blade directive

@qrcode('https://example.com', ['ecc' => 'Q', 'size' => 256, 'renderer' => 'svg'])

6) ECC Level, Version, Colors, Transparent BG

QrCode::text('Critical')->ecc('H')->version(2)->foreground('#111111')->background('#ffffff')->toSvg();
QrCode::text('Transparent')->background('transparent')->toSvg();

7) Wi‑Fi, vCard, Alphanumeric

QrCode::text('WIFI:S:Home;T:WPA;P:secret;;')->toSvg();

$vcard = "BEGIN:VCARD\nVERSION:3.0\nFN:John Doe\nTEL:+123456789\nEMAIL:john@example.com\nEND:VCARD";
QrCode::text($vcard)->toSvg();

QrCode::text('ABCD-1234 $%*+-./:')->toSvg(); // Alphanumeric mode

8) Artisan

php artisan qrcode:make "Hello" --path=storage/app/hello.png --ecc=Q --version=2 --renderer=svg --size=256 --margin=4 --fg=#000000 --bg=#ffffff

Configuration (config/qrcode.php)

return [
    'version' => null, // auto
    'ecc' => 'M',
    'margin' => 4,
    'scale' => 10,
    'renderer' => 'svg', // svg|gd|imagick
    'fg_color' => '#000000',
    'bg_color' => '#ffffff',
    'eci' => false,
    'cache' => false,
    'cache_ttl' => 3600,
];

Extending to Versions 5–40

  1. Add total codewords per version and EC block structures in Encoder\Version::$ecTable.
  2. Add alignment pattern center coordinates in Encoder\MatrixBuilder::alignmentCenters(). No other changes are required. The encoder, masking, and placement logic already generalize.

Security & Performance

  • Validate and limit input length to prevent excessive memory usage.
  • Use SVG when possible for crisp scaling. GD/Imagick are optional for PNG.
  • Avoid untrusted content injection when echoing inline HTML; prefer Response helpers.

License

MIT