tehilim に「PHPStan で戻り値を検査できる生 SQL」を入れた
自作の PHP 向け DB ツールキット tehilim に、生 SQL を書いて実行し、その戻り値を PHPStan で検査できる仕組みを入れた。この記事はその設計メモと、途中で踏んだ CI の罠、Copilot レビューとのやり取りの記録。 tehilim とは Prisma 風のスキーマファイルから、型付きのクエ…
318 件の記事
自作の PHP 向け DB ツールキット tehilim に、生 SQL を書いて実行し、その戻り値を PHPStan で検査できる仕組みを入れた。この記事はその設計メモと、途中で踏んだ CI の罠、Copilot レビューとのやり取りの記録。 tehilim とは Prisma 風のスキーマファイルから、型付きのクエ…
echo "Hello"; だけの PHP スクリプトを strace にかけたら、ログが 2335 行になった。 C で同じことをすると 35 行。この 66 倍の差はどこから来るのか、というのが今回の話。 結論から言うと、犯人の 6 割は PHP ではなくバージョン管理ツールの shim で、 さらにその原因は自分…
RelayerというPHPのWebフレームワークに続いてTehilimというPrismaみたいなPHPのデータベースライブラリを作った。 https://github.com/polidog/tehilim モチベーション PHPのDB周りのライブラリ(ORM)は基本WebフレームワークにくっついてくるDoctrine…
以前、usePHPというライブラリを作っているという記事を書いた。 その後、仕事が忙しくてなかなか開発を進められなかったが、やっと最近時間ができてusePHPの開発を進めることができた。 usePHPはReactのようなUIに関するライブラリであって、それ単体だけで使うことはちょっと難しい。 一応Router機能がある…
ここ数年PHPを使った開発を避けるようにしてきた。 理由は簡単で、Vercel + Nextjs(App Router)が結構強力な存在だったから。 ここ数年PHPを使わない理由 PHPでバックエンド作ってAPI仕様書を用意して、フロントエンド側として独立して開発みたいなの一見良さそうに見えるけど結構ツラミがある AP…
GuzzleでJSONをリクエストボディにセットしてPOSTリクエストを送る際、空配列のパラメータは空配列としてJSONに変換される。これはPHPの仕様として仕方ない部分がある。 しかし、空のオブジェクト {} として変換したい場合もある。 例えば弊社で作っているPrintgraphのAPIでは、params というリ…
はじめに Zendeskを利用しているとき、ユーザーのプライマリメールアドレスを変更する必要が出てくることがあります。特にAPIを使って自動化する場合、少し複雑な手順が必要になります。 今回は、Zendesk APIを使ってユーザーのプライマリメールアドレスを更新する方法についてご紹介します。 なぜ複雑なのか? Zen…
PHPでJSONを扱う際に、json_encode() 関数を使うとマルチバイト文字が \uXXXX 形式にエスケープされてしまう ことがあります。この挙動を理解し、適切に対処する方法について解説します。 json_encode でマルチバイト文字がエスケープされる問題 通常、PHPの json_encode() 関数…
GuzzleはPHPでよく使われるHTTPクライアントの一つです。 しかし、Guzzleを使う際に base_uri に関連するトラブルに頻繁に遭遇することがあります。この問題を解決するために、base_uriの使い方と、その際に注意すべき点をこの記事でまとめます。 base_uriの使い方 Guzzleのクライアント…
Vercelは、Next.jsなどのフロントエンドアプリケーションのproduction環境としてよく使われますが、実はPHPも動かすことができます。 vercel-community/php PHPerとしては、何かPHPのアプリケーションをVercelで動かしたいと思い、今回はBEAR SundayをVercelで…
WordPressをHeadlessCMSとして使いたいと思い、WordPressが用意しているREST APIではなく、独自のエンドポイントを作りたいと考えました。 通常、独自のエンドポイントを設定する場合は rest_api_initのアクションフックを使用します。 WP REST API を使って独自エンドポイン…
Dockerで用意した環境のphpでbasename関数をつかって日本語文字が消えてしまう問題が発生していました。 Googleで検索すると大体は setlocale(LC_ALL, 'ja_JP.UTF-8'); すればいいと書いてあったので脳死で設定してみましたが、ダメでした。 setlocale(LC_ALL, …
PHPUnit11でProphecyを使おうと思ったら使えなかったのが事の発端です。 https://twitter.com/polidog/status/1762843240515199213 ただし、現在はphpspec/prophecy-phpunitのv2.2.0が出たのでphpunit11でもProphecy…
ちょっと古いプロジェクトで、SymfonyのバージョンやPHPのバージョンを上げたいと思いましたがテストがないのでこわいなということで、テストを書き始めました。 nelmio/aliceを使ってテスト用のダミーデータを作っていましたが current まわりでちょっとつまずいてしまいました。 どのような問題が起きたのか…
Herokuの.user.iniに関するトラブルがあったのでメモしときます。 (以前もはまったようなハマってないような・・・。) HerokuでPHPの設定を変更するときは .user.ini を利用して設定を変更します。 .user.iniはあるのに設定が反映されない 今回起きたトラブルは.user.iniがあるのに…
Docker composeでそれっぽい環境を用意して、xdebug動かしてみたよって話です。 docker-composeの定義 こんな感じです。 version: "3" volumes: db-store: services: db: image: postgres:11 volumes: - db-store:…
Symfony5.3 + hautelook/alice-bundleの組み合わせで RefreshDatabaseTrait を利用してテストを書いてたんですが、sentry-symfonyを導入してテストを実行したらエラーが大量に発生しました。 エラーを確認してみると以下のTRUNCATE TABLEできないとエラ…
BigSurなMacにPHP7.4の環境の構成に php-amqpを入れた見聞録です。 きっかけはsymfony/messengerコンポーネントでキューの処理にRabbitMQを使おうとしたらphp-amqpが必要だと言われたことでした。 librabbitmqを入れる brewで入れます。 $ brew insta…
SymfonyでCI回す際に bin/console lint:yaml でyamlのチェックすることもあるかと思います。 僕はlint系は常にCIでチェックする派です。 services.yamlでtagged_iteratorの設定をすると以下のエラーが出ました。 $ bin/console lint:yaml c…
最近のSymfonyでメール送信をする場合にSwiftmailerではなくsymfony/mailerを使うことが多いかと思います。 テストではメール送信したくないみたいなことも多いハズ。 Swiftmailerでテスト時にメールを送らないようにする 公式ドキュメントに記述がありますが、swiftmailer.yaml…
今年のPHPerKaigiはオンラインなので子育て中でも参加できるぞ!!! なんて最初は気合をいれていたものの、仕事が忙しかったり、引っ越しでバタバタしていたりで全然参加できなかった僕です。 で、お前どの発表聞いてたのよ? 実践ATDD 〜TDDから更に歩みを進めたソフトウェア開発へ〜 そのコード、フレームワークの外で…
今日はPdoSessionHandlerでハマったので記録しておく。 何にはまったのか? PdoSessionHandlerを利用する際にunix socketでMySQLに接続しようとしたら、PHP Notice: PDOException: SQLSTATE[HY000] [2002] No such file o…
古いphpの場合はdockerのメモリ割り当てを多めにしたほうがいいかもです。 今回は大人の事情で使っているPHP7.1系でcomposer requireしたら、うまくいかなかったので色々と頑張った結果を記事に残しておきたいと思います。 docker-composeファイル まず、大人の事情でPHP7.1の環境が必要…
Symfonyを動かすコンテナを作るときにPHPだけの環境なら比較的に作りやすいです。 ただ、webpacke-encoreが絡んでくるとちょっとめんどくさい。 なのでmulti stage buildを利用してサクッと環境を作ってみました。 まずは普通にphpだけのコンテナ 自分はこんな感じにすることが多いです。 F…
nelmio/NelmioApiDocBundleでスキーマの定義するのは結構だるいことが多いです。 @Model アノテーションとか使って簡単に定義することもできますが、最終的にJSONになるのにクラスにマッピングしてレスポンス返すのが微妙だと感じる場合もあると思います。 そこで、JsonSchema活用できないかな…