The Vibes — the unofficial Laracon US Day 3 event. Early Bird tickets available until March 31!
Plugin Marketplace

nativephp/mobile-scanner

QR code and barcode scanner plugin for NativePHP Mobile - supports multiple barcode formats with continuous scanning

Scanner Plugin for NativePHP Mobile#

Barcode and QR code scanning plugin for NativePHP Mobile applications.

Overview#

The Scanner API provides cross-platform barcode and QR code scanning capabilities through a native camera interface.

Installation#

Copied!
composer require nativephp/mobile-scanner

Usage#

PHP (Livewire/Blade)#

Copied!
use Native\Mobile\Facades\Scanner;
use Native\Mobile\Events\Scanner\CodeScanned;
 
// Open scanner
Scanner::scan();
 
// Listen for scan results
#[OnNative(CodeScanned::class)]
public function handleScan($data, $format, $id = null)
{
Dialog::toast("Scanned: {$data}");
}

JavaScript (Vue/React/Inertia)#

Copied!
import { Scanner, On, Off, Events } from '#nativephp';
 
// Open scanner
await Scanner.scan();
 
// Listen for scan results
const handleScan = (payload) => {
const { data, format, id } = payload;
console.log(`Scanned: ${data}`);
};
 
On(Events.Scanner.CodeScanned, handleScan);

Configuration Methods#

prompt(string $prompt)#

Set custom prompt text displayed on the scanner screen.

Copied!
Scanner::scan()->prompt('Scan product barcode');
Copied!
await Scanner.scan()
.prompt('Scan product barcode');

continuous(bool $continuous = true)#

Keep scanner open to scan multiple codes. Default is false (closes after first scan).

Copied!
Scanner::scan()->continuous(true);
Copied!
await Scanner.scan()
.continuous(true);

formats(array $formats)#

Specify which barcode formats to scan. Default is ['qr'].

Available formats: qr, ean13, ean8, code128, code39, upca, upce, all

Copied!
Scanner::scan()->formats(['qr', 'ean13', 'code128']);
Copied!
await Scanner.scan()
.formats(['qr', 'ean13', 'code128']);

id(string $id)#

Set a unique identifier for the scan session. Useful for handling different scan contexts.

Copied!
Scanner::scan()->id('checkout-scanner');
Copied!
await Scanner.scan()
.id('checkout-scanner');

Combined Example#

Copied!
Scanner::scan()
->prompt('Scan your ticket')
->continuous(true)
->formats(['qr', 'ean13'])
->id('ticket-scanner');
Copied!
await Scanner.scan()
.prompt('Scan your ticket')
.continuous(true)
.formats(['qr', 'ean13'])
.id('ticket-scanner');

Events#

CodeScanned#

Fired when a barcode is successfully scanned.

Properties:

  • string $data - The decoded barcode data
  • string $format - The barcode format
  • string|null $id - The scan session ID (if set)

PHP

Copied!
use Native\Mobile\Attributes\OnNative;
use Native\Mobile\Events\Scanner\CodeScanned;
 
#[OnNative(CodeScanned::class)]
public function handleScan($data, $format, $id = null)
{
if ($id === 'product-scanner') {
$this->addProduct($data);
}
}

Vue

Copied!
import { On, Off, Events } from '#nativephp';
import { onMounted, onUnmounted } from 'vue';
 
const handleScan = (payload) => {
const { data, format, id } = payload;
 
if (id === 'product-scanner') {
addProduct(data);
}
};
 
onMounted(() => {
On(Events.Scanner.CodeScanned, handleScan);
});
 
onUnmounted(() => {
Off(Events.Scanner.CodeScanned, handleScan);
});

React

Copied!
import { On, Off, Events } from '#nativephp';
import { useEffect } from 'react';
 
const handleScan = (payload) => {
const { data, format, id } = payload;
 
if (id === 'product-scanner') {
addProduct(data);
}
};
 
useEffect(() => {
On(Events.Scanner.CodeScanned, handleScan);
 
return () => {
Off(Events.Scanner.CodeScanned, handleScan);
};
}, []);

Platform Support#

  • Android: ML Kit Barcode Scanning (API 21+)
  • iOS: AVFoundation (iOS 13.0+)

Notes#

  • Permissions: You must enable the scanner permission in config/nativephp.php to use the scanner. Camera permissions are then handled automatically, and users will be prompted for permission the first time the scanner is used.