もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

Laravel11で `DB::connection()->getDoctrineSchemaManager()->listTableNames()` は使えない

こんばんは。

簡単なLaravelネタです。

最近あるプロジェクトを Laravel10から11へアップグレードしました。

その際にエラーがでたので、そちら備忘録で残しておきます。

本題

今回アップグレードでエラーが出た箇所は以下

$tables = DB::connection()->getDoctrineSchemaManager()->listTableNames();

接続先のDBのテーブル名一覧を取得するというコードです。

こちらLaravel11では getDoctrineSchemaManager() が削除されており使用不可になっています。

readouble.com

こちら対応策としては、以下のコードで代替が可能でした。

$tables = Schema::connection()->getTableListing();

非常にわかりやすくなった印象です。

終わりに

簡単な備忘録ですが以上です。

GWが終わってまだ五月病ですが、来週からの仕事も頑張ります。

ngrokで複数のポートを使用してみる

はじめに

こんばんは。

ngrok今でもよく使っているんですが、あれは基本的に指定した一つのポートのみしか使えません。

ただ、設定ファイルを使って複数のポートを設定できるようです。

本題

よく使うのは以下だと思います。

$ ngrok http 8080
K8s Gateway API support available now: https://ngrok.com/r/k8sgb                                                                                                                                                                                               
                                                                                                                                                                                                                                                               
Session Status                online                                                                                                                                                                                                                           
Account                       xxxxxxxx (Plan: Free)                                                                                                                                                                                                            
Update                        update available (version 3.9.0, Ctrl-U to update)                                                                                                                                                                               
Version                       3.8.0                                                                                                                                                                                                                            
Region                        Japan (jp)                                                                                                                                                                                                                       
Web Interface                 http://127.0.0.1:4040                                                                                                                                                                                                            
Forwarding                    https://93b2-240d-1a-936-9d00-706c-6bf9-72da-357f.ngrok-free.app -> http://localhost:8080                                                                                                                                        
                                                                                                                                                                                                                                                               
Connections                   ttl     opn     rt1     rt5     p50     p90                                                                                                                                                                                      

こんな感じで 8080番を使用できています。

今回は、設定ファイルを書いてみます。

$ cat local.yml 
version: 2
authtoken: xxxxxxxxxxxxxxxxxxxxxxxxxx_zzzzzzzzzzzzzzzzzzzzzzzzz
tunnels:
  first:
    proto: http
    addr: 8080
  second:
    proto: http
    addr: 8081
$ ngrok start --config local.yml --all
Full request capture now available in your browser: https://ngrok.com/r/ti                                                                                                                                                                                     
                                                                                                                                                                                                                                                               
Session Status                online                                                                                                                                                                                                                           
Account                       xxxxxxxxxx (Plan: Free)                                                                                                                                                                                                            
Update                        update available (version 3.9.0, Ctrl-U to update)                                                                                                                                                                               
Version                       3.8.0                                                                                                                                                                                                                            
Region                        Japan (jp)                                                                                                                                                                                                                       
Web Interface                 http://127.0.0.1:4040                                                                                                                                                                                                            
Forwarding                    https://0b88-240d-1a-936-9d00-706c-6bf9-72da-357f.ngrok-free.app -> http://localhost:8081                                                                                                                                        
Forwarding                    https://563a-240d-1a-936-9d00-706c-6bf9-72da-357f.ngrok-free.app -> http://localhost:8080                                                                                                                                        
                                                                                                                                                                                                                                                               
Connections                   ttl     opn     rt1     rt5     p50     p90                                                                                                                                                                                      

Forwarding を見てもらえたらわかりますが、設定ファイルに記載した2つのポートが使われています。

終わりに

ぶっちゃけ2つを使うことはそこまでなさそうですが、知っておくと便利そうです。

現場からは以上です。

Dockerのマルチステージビルドを試してみた

はじめに

こんばんは。

Dockerネタです。

前々からローカル環境・検証環境でDockerfileを分けたいなと思っていて、ファイルを分けずにどうにかできないかと考えていたのですが、マルチステージビルドというのがあり、今回試してみました。

docs.docker.jp

本題

Dockerfile

# ローカル & 検証どちらも
FROM php:8.3-apache AS base

RUN apt-get update \
  && apt-get install -y libzip-dev \
  && docker-php-ext-install zip

RUN apt-get update \
  && apt-get install -y libicu-dev \
  && docker-php-ext-install intl

RUN docker-php-ext-install pdo_mysql

# 検証のみ
FROM base AS staging
RUN docker-php-ext-install opcache
COPY docker/php/opcache.ini /usr/local/etc/php/conf.d/

docker-compose.yml

services:
  web:
    platform: linux/amd64
    build:
      context: .
      dockerfile: Dockerfile
      target: base

docker-composeでは targetを base にすることによりopcacheは入らず 検証環境では targetを staging にすることで opcacheがinstallされます。

終わりに

今まで .local とか .staging とかのDockerfileを作ってたので、これはとても助かります。

もっと積極的に使っていこうと思いました。

現場からは以上です。

積みゲー多すぎる

久々にだらっとした日記。

最近やっと積んでたゲーム 風花雪月をクリアしました。

全学級 + DLC クリアするのにめちゃ時間かかりました...

龍が如く8やりたいなート思ってるんですが、それより前に積んでるゲームが多すぎてまだたどり着けなそうです。

さしあたっては龍が如く7の外伝

キングダムハーツ3

ユニコーンオーバーロード

Ghostwire:Tokyo

ファイヤーエムブレムエンゲージ

プラスあと5作品ほど。

めまいがする。

仕事の合間になんとか消化していきます。

現場からは以上です。

DBが複数存在する場合のRefreshDatabaseトレイトを使ったテスト

はじめに

こんばんは。

Laravelでテスト書く際に 最初に必要なSeederを読み込んで 各テストを行いたい場合ってよくあると思いますが、その際は必ず RefreshDatabase トレイトをuseする必要があります。

そのさいDBが複数存在する場合に限りうまくいきません。

色々調べたのですが以下の例のように RefreshDatabase の処理をオーバライドする必要がありそうです。

qiita.com

本題

<?php

namespace Tests;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\RefreshDatabaseState;
use Illuminate\Foundation\Testing\TestCase as BaseTestCase;

abstract class TestCase extends BaseTestCase
{
    use CreatesApplication;
    use RefreshDatabase;

    protected string $seeder = TestCaseSeeder::class;

    protected array $connectionsToTransact = ['mysql', 'mysql2', 'mysql3'];

    ↓以下をオーバライド
    protected function refreshTestDatabase()
    {
        if (! RefreshDatabaseState::$migrated) {
            foreach ($this->connectionsToTransact() as $database) {
                $this->artisan('db:wipe', array_filter([
                    '--database' => $database,
                    '--drop-views' => $this->shouldDropViews(),
                    '--drop-types' => $this->shouldDropTypes(),
                    '--force' => true,
                ]));
            }

            $this->artisan('migrate', [
                '--seeder' => $this->seeder,
                '--force'  => true,
            ]);

            $this->app[Kernel::class]->setArtisan(null);

            RefreshDatabaseState::$migrated = true;
        }

        $this->beginDatabaseTransaction();
    }
}

db:wipeはDB数分実行が必要で、migrateに関してはmigrationsテーブルを作成するためにデフォルトの指定のみでOK。

終わりに

なんかもっと良さげな解決法ありそうですがね。。。。

なにか知ってたら誰か教えてください。

Laravelでファイルダウンロード

はじめに

こんばんは。

あんまりダウンロード機能とか作ってなかったのですが、久々にLaravelで作ったので備忘録っときます。

めちゃ短いですが...

本題

<?php

namespace App\Http\Controllers;

use App\Model\File;
use Illuminate\Http\Response;
use Illuminate\Routing\ResponseFactory;

class DownloadAction
{
    public function __construct(private readonly ResponseFactory $responseFactory) 
    {
    }

    public function __invoke(string $id): Response
    {
        $binary = Storage::get("{$id}");
        return $this->responseFactory->make(
            $binary,
            200,
            [
                'Content-Type' => 'octet-stream',
                'Content-Disposition' => 'attachment; filename="ダウンロードファイル"',
                'Content-Length' => strlen($binary)
            ]
        );
    }
}

ResponseFactoryのmakeで ヘッダーを生成してダウンロードできます。

終わりに

昔ながらの header関数 とかは使わなくてもいいって素敵ですね。

現場からは以上です。

phpでQRコード作成

はじめに

こんばんは。

QRコード生成ライブラリはJSでメインで使っていて、あとはGo言語で少しだけやった記憶があったんですが、今回PHPでも使う機会があったので、備忘録残しておきます。

本題

使用したのはこちら

github.com

今回のユースケースは、 Laravelでメール通知の際に特定のURLのQRコードを作成して、メールに添付して送りたいってことでした。

<?php

use Endroid\QrCode\QrCode;
use Endroid\QrCode\Writer\PngWriter;

$qrCode      = QrCode::create(route('users.answer'))->setSize(200);
$urlBase64 = (new PngWriter())
    ->write($qrCode)
    ->getDataUri();


dd($urlBase64);
    

これで対象のURLのQRコード画像のbase64が取れます。

あとは <img src='{$urlBase64}' /> とかしてあげれば表示されます。

らくー。

PngWriter以外にも PdfWriterや SvgWriterなどもあります。

用途で使い分けれるみたいです。

終わりに

phpではやったことなかった?んですが、JSと同じくめちゃ簡単でした。

現場からは以上です。