Megu
【Laravel】Docker環境でQRコードの生成

【Laravel】Docker環境でQRコードの生成

2023.01.21

Laravel
PHP
Docker

Docker, Laravelの開発環境においてsimple-qrcodeでQRコードを生成する仕組みを導入したのでそのメモ。
Github→ https://github.com/SimpleSoftwareIO/simple-qrcode

環境

Docker
● php:7.4-fpm-alpine3.12
Laravel
● v8.12

ライブラリの導入

simple-qrcodeのインストールを行なう。
v4としているのは、公式のドキュメントに記載されているからです。
v3以前は問題があったようでv4推奨とのこと。

There was a Laravel facade issue within v3 that causes some loading issues. The only way to fix this was to create a backwards breaking change so v4 has been released.
$ docker compose exec <your-service> composer require simplesoftwareio/simple-qrcode "~4"


ライブラリ自体が導入されたかはインストール完了後に、下記コマンドで確認。
このような感じでインストール結果が表示されるはずです。

$ docker compose exec <your-service> composer show --installed | grep simple-qrcode
>> simplesoftwareio/simple-qrcode    4.2.0   Simple QrCode is a QR code generator made for Laravel.

QRコードの生成の前に...

あとは、「simplesoftwareio/simple-qrcode」を使用してQRコードの生成を行えば良いのですが、一つ追加で確認することがあります。
「simple-qrcode」を含む多くのライブラリはデフォルトのQRコード生成結果を画像ではなくSVGで出力するようになっています。
つまり画像生成の機能自体はオプションだということです。
simple-qrcodeでは画像生成を行なうにはPHPの拡張モジュールの「imagick」を導入する必要があるので注意。

imagickの導入

関連パッケージのインストールを行います。
(環境によって既に入っているパッケージが異なるので適宜追加すること)
ここら辺が疎いので、諸々時間がかかりました...

# imagemagickに関連するパッケージの追加
RUN apk update && \
	    apk add --no-cache \
	    libpng-dev libjpeg-turbo-dev freetype-dev imagemagick imagemagick-dev autoconf g++ make

RUN pecl install imagick

RUN docker-php-ext-configure gd --with-freetype --with-jpeg
RUN docker-php-ext-install -j$(nproc) gd
RUN docker-php-ext-enable imagick


余談ですが、PHP拡張のインストールと有効化を一度に行ってくれるコマンドがあるんですね...上で言うと次の部分です。

RUN docker-php-ext-install <任意>


開発中に既存で入っていたので取り敢えず、peclを使ってインストール→docker-php-ext-enableで有効化としていました。
どうやらdocker-php-ext-installはそれをまとめてしてくれているようですね...!
【PHP・Laravel】peclとは何か?pecl install と docker-php-ext-installの違い。docker-php-ext-enableなどの使い方を実例で解説(pearとの違い)

しっかりと「imagick」がインストールされ、pngが画像生成の対応するフォーマットに含まれるか確認しましょう。
自身のサービスの任意の画面でphpinfoを呼び出し、imagickとその対応するフォーマットが含まれているか確認。
(simple-qrcodeはpngでの画像生成に対応しているのでpngを確認すること。)

phpinfo();


QRコードの生成処理

たったこれだけで簡単にですが画像生成ができます。
formatメソッドでpngを指定することでsvg出力されるQRコードをpngに変換してくれます。
format('png')を指定して、変換できないとエラーが出た場合は、imagickがインストールされていないかもしれません。
再度インストールを試みて下さい。
自分の場合は、base64にエンコードして取得するAPIを作成しフロントからAjaxで取得→表示するようにしています。
適宜、s3に保存したり、publicに配置したりできるのでいいですね。

use SimpleSoftwareIO\QrCode\Facades\QrCode;
// 省略...
$url = '任意のurl';
$base64_qrcode_img = base64_encode(QrCode::size(250)->format('png')->generate($url));
return response()->json([
  "base64_qrcode_img" => $base64_qrcode_img
]);
// ...省略