Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Bacon Qr Code Laravel Package

bacon/bacon-qr-code

PHP QR code generator (ZXing encoder port) with multiple renderers/back ends: Imagick, SVG, EPS, and a separate GDLib renderer. Generate QR codes to files or output with customizable size/style via Renderer and Writer APIs.

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation:

    composer require bacon/bacon-qr-code
    
  2. Basic Usage (Imagick backend):

    use BaconQrCode\Writer;
    use BaconQrCode\Renderer\ImageRenderer;
    use BaconQrCode\Renderer\Image\ImagickImageBackEnd;
    
    $writer = new Writer(new ImageRenderer(400, new ImagickImageBackEnd()));
    $writer->writeFile('Hello World!', 'qrcode.png');
    
  3. GD Alternative (if Imagick unavailable):

    use BaconQrCode\Renderer\GDLibRenderer;
    
    $writer = new Writer(new GDLibRenderer(400));
    $writer->writeFile('Hello World!', 'qrcode.png');
    

First Use Case

Generate a QR code for a product page URL and embed it in a Blade view:

// In a controller
public function showProduct($id) {
    $qr = new Writer(new ImageRenderer(300, new ImagickImageBackEnd()));
    $qr->writeFile(route('product.show', $id), storage_path('app/qr_'.$id.'.png'));
    return view('product.show', ['qr_path' => 'qr_'.$id.'.png']);
}

// In Blade
<img src="{{ asset('storage/qr_'.$product->id.'.png') }}" alt="QR Code">

Implementation Patterns

Core Workflows

  1. Dynamic QR Generation

    // Generate QR for user-specific data
    $userData = ['id' => $user->id, 'email' => $user->email];
    $qrData = json_encode($userData);
    $writer->writeFile($qrData, "user_{$user->id}.png");
    
  2. Custom Styling

    use BaconQrCode\Renderer\RendererStyle\RendererStyle;
    use BaconQrCode\Renderer\Color\Rgb;
    
    $style = new RendererStyle(400);
    $style->setForegroundColor(new Rgb(0, 102, 204)); // Blue
    $style->setBackgroundColor(new Rgb(255, 255, 255)); // White
    $style->setMargin(2);
    
    $renderer = new ImageRenderer($style, new ImagickImageBackEnd());
    
  3. SVG Output for Scalability

    use BaconQrCode\Renderer\Image\SvgImageBackEnd;
    
    $writer = new Writer(new ImageRenderer(500, new SvgImageBackEnd()));
    $writer->writeFile('https://example.com', 'qr.svg');
    
  4. Batch Processing

    $urls = ['url1', 'url2', 'url3'];
    foreach ($urls as $index => $url) {
        $writer->writeFile($url, "batch_{$index}.png");
    }
    

Integration Tips

  1. Service Provider Pattern

    // app/Providers/QrCodeServiceProvider.php
    public function register() {
        $this->app->singleton('qr.writer', function() {
            return new Writer(new ImageRenderer(
                new RendererStyle(400),
                new ImagickImageBackEnd()
            ));
        });
    }
    
  2. Middleware for QR Generation

    // Generate QR for all authenticated users
    public function handle($request, Closure $next) {
        if (auth()->check()) {
            $writer = app('qr.writer');
            $writer->writeFile(route('user.profile', auth()->id()),
                storage_path("app/qr_{auth()->id()}.png"));
        }
        return $next($request);
    }
    
  3. API Endpoint

    Route::get('/qr/{data}', function($data) {
        $writer = new Writer(new GDLibRenderer(300));
        $path = temp_path('qr_'.md5($data).'.png');
        $writer->writeFile($data, $path);
        return response()->file($path)->deleteFileAfterSend(true);
    });
    
  4. Caching Strategy

    public function getQrCode($data) {
        $cacheKey = 'qr_'.md5($data);
        return Cache::remember($cacheKey, now()->addHours(1), function() use ($data) {
            $writer = app('qr.writer');
            $path = storage_path("app/{$cacheKey}.png");
            $writer->writeFile($data, $path);
            return $path;
        });
    }
    

Gotchas and Tips

Common Pitfalls

  1. Imagick Artifacts

    • Issue: White pixel artifacts with ImagickImageBackEnd (especially with margin=0).
    • Solution: Use SvgImageBackEnd or GDLibRenderer for artifact-free output.
      // Fallback to SVG if artifacts are critical
      $backend = extension_loaded('imagick') ? new ImagickImageBackEnd() : new SvgImageBackEnd();
      
  2. GD Limitations

    • Issue: GDLibRenderer produces square QR codes and lacks gradients.
    • Solution: Use only for simple cases or when Imagick/SVG isn't available.
  3. Memory Limits

    • Issue: Large QR codes (e.g., version 40+) may hit memory limits.
    • Solution: Use SvgImageBackEnd for scalable vector output or optimize size:
      $style = new RendererStyle(300); // Smaller size
      
  4. Extension Dependencies

    • Issue: Missing xmlwriter for SVG output or imagick for raster images.
    • Solution: Check extensions early and provide fallbacks:
      if (!extension_loaded('xmlwriter')) {
          throw new \RuntimeException('xmlwriter extension required for SVG output');
      }
      

Debugging Tips

  1. Validate QR Codes Use online validators (e.g., QR Code Generator) to verify output.

  2. Log Errors Wrap generation in try-catch:

    try {
        $writer->writeFile($data, $path);
    } catch (\Exception $e) {
        Log::error("QR Generation failed: {$e->getMessage()}");
        throw $e;
    }
    
  3. Size Calculation Use BaconQrCode\Writer::getSize() to estimate dimensions before generation:

    $size = $writer->getSize($data);
    $style = new RendererStyle($size);
    

Performance Optimization

  1. Reuse Writers Instantiate writers once (e.g., in a service container) rather than per-request.

  2. Cache Renderers

    $renderer = new ImageRenderer(
        new RendererStyle(400),
        new ImagickImageBackEnd()
    );
    Cache::remember('qr.renderer', now()->addDays(7), function() use ($renderer) {
        return $renderer;
    });
    
  3. Async Generation Use queues for non-critical QR codes:

    Queue::push(new GenerateQrJob($data, $path));
    

Advanced Features

  1. Custom Eyes

    use BaconQrCode\Renderer\RendererStyle\Eye\SimpleCircleEye;
    
    $style = new RendererStyle(400);
    $style->setEye(new SimpleCircleEye());
    
  2. Gradient Backgrounds

    use BaconQrCode\Renderer\Color\Rgb;
    use BaconQrCode\Renderer\RendererStyle\Gradient\LinearGradient;
    
    $style = new RendererStyle(400);
    $style->setBackgroundGradient(
        new LinearGradient(
            new Rgb(255, 0, 0),
            new Rgb(0, 0, 255)
        )
    );
    
  3. Transparent PNGs

    $style = new RendererStyle(400);
    $style->setBackgroundColor(new Rgb(0, 0, 0, 0)); // RGBA with alpha=0
    

Configuration Quirks

  1. PHP Version

    • Requires PHP 8.1+ (as of v3.0.0). Use GDLibRenderer for older versions.
  2. Imagick Antialiasing Enable for smoother edges (v3.1.0+):

    $backend = new ImagickImageBackEnd();
    $backend->setAntialias(true);
    
  3. UTF-8 Handling Ensure input strings are UTF-8 encoded:

    $data = mb_convert_encoding($data, 'UTF-8');
    
  4. Error Handling Check for BaconQrCode\Exception\WriterException when generation fails.

Extension Points

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
davejamesmiller/laravel-breadcrumbs
artisanry/parsedown
christhompsontldr/phpsdk
enqueue/dsn
bunny/bunny
enqueue/test
enqueue/null
enqueue/amqp-tools
milesj/emojibase
bower-asset/punycode
bower-asset/inputmask
bower-asset/jquery
bower-asset/yii2-pjax
laravel/nova
spatie/laravel-mailcoach
spatie/laravel-superseeder
laravel/liferaft
nst/json-test-suite
danielmiessler/sec-lists
jackalope/jackalope-transport