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 ported from ZXing (encoder only). Render to PNG via Imagick, or output SVG/EPS; includes a separate GDLib renderer. Simple Writer API to generate QR codes to files or strings.

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation:

    composer require bacon/bacon-qr-code
    
  2. Basic Usage (GDLib for simplicity):

    use BaconQrCode\Writer;
    use BaconQrCode\Renderer\GDLibRenderer;
    
    $writer = new Writer(new GDLibRenderer(400)); // 400px size
    $writer->writeFile('Hello World!', 'qrcode.png');
    
  3. Key Classes:

    • Writer: Main entry point for QR generation.
    • Renderer: Abstract base for output formats (e.g., GDLibRenderer, ImageRenderer).
    • RendererStyle: Configures QR appearance (size, colors, etc.).

First Use Case

Generate a QR code for a user profile link in a Laravel controller:

use BaconQrCode\Writer;
use BaconQrCode\Renderer\GDLibRenderer;

public function generateProfileQr(User $user)
{
    $writer = new Writer(new GDLibRenderer(300));
    $writer->writeFile(
        route('profile.show', $user),
        storage_path("app/qr_{$user->id}.png")
    );
    return response()->download(storage_path("app/qr_{$user->id}.png"));
}

Implementation Patterns

Common Workflows

1. Dynamic QR Generation

  • Use Case: Generate QR codes for order confirmations, event tickets, or API tokens.
  • Pattern:
    public function generateOrderQr(Order $order)
    {
        $writer = new Writer(
            new GDLibRenderer(350, 'black', 'white')
        );
        $writer->writeFile(
            route('orders.show', $order),
            storage_path("app/qr_orders/{$order->id}.png")
        );
    }
    

2. Custom Styling with SVG

  • Use Case: High-quality, scalable QR codes (e.g., for print media).
  • Pattern:
    use BaconQrCode\Renderer\ImageRenderer;
    use BaconQrCode\Renderer\Image\SvgImageBackEnd;
    use BaconQrCode\Renderer\RendererStyle\RendererStyle;
    
    $renderer = new ImageRenderer(
        new RendererStyle(500, 'black', 'transparent'),
        new SvgImageBackEnd()
    );
    $writer = new Writer($renderer);
    $writer->writeFile('https://example.com', 'qrcode.svg');
    

3. Batch Generation

  • Use Case: Pre-generate QR codes for bulk operations (e.g., inventory tags).
  • Pattern:
    public function batchGenerateQrCodes(array $items)
    {
        $writer = new Writer(new GDLibRenderer(250));
        foreach ($items as $item) {
            $writer->writeFile(
                "item:{$item->id}",
                "public/qr_{$item->id}.png"
            );
        }
    }
    

4. Integration with Laravel Storage

  • Use Case: Store QR codes in S3 or other cloud storage.
  • Pattern:
    use Illuminate\Support\Facades\Storage;
    
    public function generateAndStoreQr($content, $filename)
    {
        $writer = new Writer(new GDLibRenderer(400));
        $writer->writeFile($content, storage_path("app/{$filename}.png"));
        Storage::disk('s3')->put("qrcodes/{$filename}.png", file_get_contents(storage_path("app/{$filename}.png")));
    }
    

5. Error Correction Levels

  • Use Case: Adjust QR code robustness (e.g., for damaged labels).
  • Pattern:
    use BaconQrCode\Writer;
    use BaconQrCode\Renderer\GDLibRenderer;
    use BaconQrCode\Writer\WriterOptions;
    
    $options = new WriterOptions();
    $options->setErrorCorrectionLevel(WriterOptions::ERROR_CORRECTION_LEVEL_HIGH);
    
    $writer = new Writer(new GDLibRenderer(400), $options);
    $writer->writeFile('High-error-content', 'qrcode_high.png');
    

Integration Tips

Laravel Service Provider

Register a QR code generator as a singleton:

public function register()
{
    $this->app->singleton('qrcode.generator', function () {
        return new Writer(new GDLibRenderer(400));
    });
}

Blade Directives

Create a custom Blade directive for inline QR generation:

Blade::directive('qrcode', function ($expression) {
    $content = $expression;
    $filename = 'temp_qr_' . Str::random(10) . '.png';
    $writer = app('qrcode.generator');
    $writer->writeFile($content, storage_path("app/{$filename}"));
    return "<?php echo '<img src=\"' . asset('storage/{$filename}') . '\" alt=\"QR Code\">'; ?>";
});

Usage in Blade:

@qrcode(route('profile.show', $user))

API Responses

Return QR codes as downloadable responses:

public function downloadQr($content)
{
    $writer = new Writer(new GDLibRenderer(300));
    $writer->writeFile($content, storage_path('app/qr_temp.png'));
    return response()->download(storage_path('app/qr_temp.png'))
        ->deleteFileAfterSend(true);
}

Form Request Validation

Validate QR content in form requests:

public function rules()
{
    return [
        'qr_content' => [
            'required',
            function ($attribute, $value, $fail) {
                // Validate content length (QR codes have limits)
                if (strlen($value) > 2953) {
                    $fail('The QR code content may not be greater than 2953 characters.');
                }
            },
        ],
    ];
}

Gotchas and Tips

Pitfalls

1. Imagick White Pixel Artifacts

  • Issue: ImagickImageBackEnd may produce white pixel artifacts (especially with margin=0).
  • Workaround: Use SvgImageBackEnd or GDLibRenderer for artifact-free output.
  • Example:
    // Avoid Imagick for critical use cases
    $renderer = new ImageRenderer(
        new RendererStyle(400),
        new SvgImageBackEnd() // No artifacts
    );
    

2. GDLib Limitations

  • Issue: GDLibRenderer does not support gradients or curved edges (always squared).
  • Workaround: Use ImageRenderer with ImagickImageBackEnd or SvgImageBackEnd for advanced features.
  • Example:
    // Use GD only for simple, squared QR codes
    $renderer = new GDLibRenderer(400, 'black', 'white');
    

3. PHP Extensions

  • Issue: SvgImageBackEnd requires the xmlwriter extension.
  • Check:
    if (!extension_loaded('xmlwriter')) {
        throw new \RuntimeException('The xmlwriter extension is required for SVG rendering.');
    }
    
  • Fallback: Use GDLibRenderer or ImagickImageBackEnd if xmlwriter is unavailable.

4. Content Length Limits

  • Issue: QR codes have a maximum capacity (~2953 characters for alphanumeric).
  • Validation:
    use BaconQrCode\Writer\WriterOptions;
    
    $options = new WriterOptions();
    if (strlen($content) > 2953) {
        $options->setMode(WriterOptions::MODE_BYTE);
    }
    

5. File Permissions

  • Issue: Writing QR codes to storage/app may fail due to permissions.
  • Fix:
    chmod -R 775 storage/
    
  • Alternative: Use Laravel's storage_path() with proper permissions or a dedicated directory.

6. Caching Generated QR Codes

  • Issue: Regenerating the same QR code wastes resources.
  • Solution: Cache generated QR codes by content hash.
  • Example:
    public function getQrCode($content)
    {
        $hash = md5($content);
        $path = storage_path("app/qr_cache/{$hash}.png");
    
        if (!file_exists($path)) {
            $writer = new Writer(new GDLibRenderer(400));
            $writer->writeFile($content, $path);
        }
    
        return response()->file($path);
    }
    

Debugging Tips

1. Verify Renderer Output

  • Debug: Check if the QR code is generated but not displayed.
  • Fix: Ensure the file path is correct and permissions are set.
  • Example:
    $writer->writeFile('test', 'debug_qr.png');
    if (file_exists('debug_q
    
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.
codraw/entity-migrator
codraw/doctrine-extra
codraw/aws-tool-kit
codraw/validator
codraw/workflow
codraw/open-api
codraw/cron-job
codraw/process
codraw/log
nexmo/api-specification
capell-app/block-library
axium/identity
cetria/laravel-dummy-models
cetria/reflection-helper
agropredict/sso-auth-bundle
evolvestudio/spam-protection
datacore/hub-sdk
develia/commons
cuci/prototurk-sdk
cuci/prototurk-sdk-symfony