symfony.lockとは?

 

symfonyを使ってるといつの間にか入ってて、更新もされるsymfony.lock。
composer.lockと何が違うのか等、よくわかってなかったので自分なりに調べたことをまとめます。

 

\いろいろまとめてみたんですが、すでに記事ありました!/
こちらの方が断然わかりやすいです!!!
https://zenn.dev/ttskch/articles/13013224b61531

 

symfony.lockには何が書いてある?

composer require symfony/<name> などのコマンドを叩いた時に、必要な環境変数(.env)やconfig/のyamlの追加が自動的にされることがあります。
この履歴がsymfony.lockに記録されています。
doctrine/annotationsといったsymfony/<name>以外の対象もあります。

ちなみに、
composer require symfony/notifierをした時、「config/packages/notifier.yamlを追加する」といった定義(レシピ)はsymfony/recipesによって管理されています。

さらに、
「config/packages/notifier.yamlを追加する」という定義(レシピ)の実行は、symfony/flex(Composer Plugin for Symfony)によって行われています。

composer.lockとの違いは?

  • symfony/recipesに置いてあるどのバージョン(version)のmanifest(レシピの定義)を使っているのかが明記されています。
  • 追加や更新するファイル(files)についても明記されています。
// symfony.lock
{
    "symfony/flex": {
        "version": "2.3",
        "recipe": {
            "repo": "github.com/symfony/recipes",
            "branch": "main",
            "version": "1.0",
            "ref": "146251ae39e06a95be0fe3d13c807bcf3938b172"
        },
        "files": [
            ".env"
        ]
    },
    "symfony/notifier": {
        "version": "6.3",
        "recipe": {
            "repo": "github.com/symfony/recipes",
            "branch": "main",
            "version": "5.0",
            "ref": "c31585e252b32fe0e1f30b1f256af553f4a06eb9"
        },
        "files": [
            "config/packages/notifier.yaml"
        ]
    }
}
// composer.lock
    ...
    "packages": [
        {
            "name": "symfony/flex",
            "version": "v2.3.1",
            "source": {
                "type": "git",
                "url": "https://github.com/symfony/flex.git",
                "reference": "3c9c3424efdafe33e0e3cfb5e87e50b34711fedf"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/symfony/flex/zipball/3c9c3424efdafe33e0e3cfb5e87e50b34711fedf",
                "reference": "3c9c3424efdafe33e0e3cfb5e87e50b34711fedf",
                "shasum": ""
            },
            "require": {
                "composer-plugin-api": "^2.1",
                "php": ">=8.0"
            },
            "require-dev": {
                "composer/composer": "^2.1",
                "symfony/dotenv": "^5.4|^6.0",
                "symfony/filesystem": "^5.4|^6.0",
                "symfony/phpunit-bridge": "^5.4|^6.0",
                "symfony/process": "^5.4|^6.0"
            },
            "type": "composer-plugin",
            ...

symfony.lockはsymfony/flexをrequireすると追加される

symfony/flex => Composer plugin for Symfony

$ composer require symfony/flex
...
// ↓↓↓ この辺りがsymfony/flexによって行われている。 ↓↓↓

Symfony operations: 1 recipe (ad5e8d2058412a4be7bb46bf8d4af76c)
  - Configuring symfony/flex (>=1.0): From github.com/symfony/recipes:main

// ↑↑↑ この辺りがsymfony/flexによって行われている。 ↑↑↑

No security vulnerability advisories found
Using version ^2.3 for symfony/flex


$ git status
On branch master
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git restore ..." to discard changes in working directory)
    modified:   composer.json

Untracked files:
  (use "git add ..." to include in what will be committed)
    .env
    composer.lock
    symfony.lock

no changes added to commit (use "git add" and/or "git commit -a")

 

どうなったらsymfony.lockに追加や更新されるか?

symfony/flexがinstall済みで、かつsymfony/recipesで管理されているcomposerパッケージについてcomposer requirecomposer updateをした時のようです。

また、レシピがないパッケージについても以下コマンドでsymfony.lockに追加できます。さらに、既にsymfony.lockに定義されているパッケージについてのバージョンを更新できます。

$ composer recipes:install <vendor>/<package> --force -vた

ただ、レシピがないのにsymfony.lockに定義してるパッケージは何の意味があるのかよくわかっていません🤔 誰か教えてください!

最後に

この記事を書くために、symfony/flexを読みました。Composer pluginの作り方や流れを知ることができたので次の記事で書こうと思います。

参考

PHPカンファレンス福岡2023行ってきたよ

 

2023/06/24にPHPカンファレンス福岡2023に行ってきました。

2018年ぶりの参加でした!!!
https://phpcon.fukuoka.jp/2023

 

すっごい人の色んなお話を聞けて超超超刺激になりました!
さらに色んな人と知り合えたり、懐かしい人と会えたりできたので超楽しかったです🙌
無限LTしたかったけど勇気なかったです…
「参加したならLTくらいしないともったいない」ってすっごい言われて、そうだよなーもったいないことした・・・ってなってます😭
次カンファレンス行く時は登壇予定なくてもLT用意する(目標

## メモ

Symfony6.3のおすすめ機能

– WebhookをController使わずに作れるようになった。 https://symfony.com/blog/new-in-symfony-6-3-webhook-and-remoteevent-components
– service.yamlに書いてたサービス定義を、ほぼAttributeだけでできるようになった。 https://symfony.com/blog/new-in-symfony-6-3-dependency-injection-improvements#using-autowiring-to-generate-closures
– メソッドをDIできるようになった https://symfony.com/blog/new-in-symfony-6-3-dependency-injection-improvements#using-autowiring-to-generate-closures

ref: https://symfony.com/blog/symfony-6-3-curated-new-features

 

お昼ご飯🍚

牧のうどん、うまいけど食べるの遅いと無限に増えた。
九州のやわやわうどん、すき。

お腹いっぱいで眠くなったけど、コーヒー飲み放題で助かりました🙏☕️🙏

 

夜ご飯🍚

たのしかったーーーー

みんなが幸せなら幸せ教に入信しそうuuu

まとめ

福岡またいきたいです!次はついでに実家でゆっくりできたら良い。
次は新幹線でいきたい、7千円の充電式ヘアブラシ没収された&セントレアまで遠いので。次は、ホテルさっさとチェックインしておく。

スタッフさん登壇者さんスポンサーさん参加者さん不参加だけど絡んでくださった皆様ありがとうございましたー!

↑天神から祇園のホテルまで酔っ払いながら帰った朝に撮った写真

PHPerKaigi2023参加レポ〜iwillblog〜

タイムテーブルはこちら。

https://fortee.jp/phperkaigi-2023/timetable

PHPerKaigi2023の私的状況

  • Day0、Day1 オンライン参加
  • Day2 オフライン参加 (子供を預けることに成功、こだまグリーン車早割の往復、懇親会もあるので一泊)
  • ペンライト羨ましくて、次はLTしたいと思いました。
  • ちょうぜつ本が当たった😍(既に購入済み)
  • 今年もノベルティ最高!
    • GMOさんの湯呑み良き(写真に入れ忘れた)
    • 顔パック、遠征先で化粧水がわりになったのでありがたいです!

Day0

#### PHPUnit 10 概論

https://github.com/sebastianbergmann/phpunit/blob/10.0.0/ChangeLog-10.0.md

ChangeLogをみてもRemovedが多いので、安易にupdateしにくいなとい印象でした。

差別的用語をなくした件を知って、最近whiteListという変数を作ってしまった自分を反省しました!参考にさせてもらいます!

  • blackList -> ExcludeList
  • whiteList -> filter

また、デフォルトでDeprecation, Notices, Warnings, Skippedの件数を表示しなくなるっていうのは地味に嫌なので、phpunit.xmlの設定する必要があるなということを忘れないようにしたいなと思いました。

DataProviderはよく使ってるので、仕様変更に対応しなければ 🤯

以下の条件に当てはまるDataProviderが非推奨になりました。
● staticではない
● publicではない
● 引数を必要とする
逆にいえば、以下のような形式のDataProviderを推奨しているということですね。
public static XXX() {} 

Day1

#### Composerを「なんとなく使う」から「理解して使う」になる

はい!なんとなく使ってました。思ってた通りで安心してましたが、パッケージ更新したい時にupdate?require?となることがあるのでこの表はめちゃ重宝させてもらいます🙇🙇🙇

  • composer require {package-name}composer.json/composer.lock共に更新される
  • composer update {package-name}→あくまでもcomposer.jsonのバージョン指定範囲内で更新する => composer.lockのみ更新
  • =>パッケージ更新したい時、現在のcomposer.jsonのバージョン指定じゃ希望のバージョンにならない時は、requireする必要ある。現在のcomposer.jsonのバージョン指定内の更新で良いならupdate
  • 個人的コマンドメモ
// 何が更新されるかを事前にチェックすることができる
$ composer update --dry-run

// composer.jsonのrequireにないのに依存してcomposer.lockにあるパッケージはどこ依存だ?ってときに使える 
$ composer depends {package-name}

 

Day2

現地参加の特権、アンカンファレンス 🙌

郡山さんのおもしろかった〜

https://alps-asd.github.io/ つかって設計してみたい!

 

### PHPの最高機能、配列を捨てよう!!

現地では裏のそーだいさんの見て、うずらさんのはYouTubeで視聴しました!

たしかにreturn type arrayの時、どんな配列なのか気になって深くコードを読むみたいなのありがちで時間取られちゃうのでもったいないです。

DTOを作ってその配列にするは結構やってたので、安心しました!

懇親会

何年振りかのお酒飲みながらの懇親会たのしかったです^^

 

ペチコン2022の参加メモ

 

1日目はオンラン参加で、2日目は現地参加予定しました!

モチベ上がりました!!!開催ありがとうございました🙇
現地でいろんな人に会えて楽しかったです✌️
来年は子供と行くか、それともビール飲みたいから泊まるかしたいなと妄想しております。
帰りのグリーン車からこの記事かいてます(こだま早割でのぞみ指定席より安かった)

タイムテーブル

https://fortee.jp/phpcon-2022/timetable

メモ(箇条書き)

1日目

  • フィーチャートグルよく出てきた!
  • Symfony UX使ってみたい!グラフとかしてみようかな🤔
  • スキーマ駆動開発良さそう
  • 語彙力を増やしたり、良い命名のためにもフレームワーク読んだり使うことが大事

2日目

来年の自分へのメモ

  • 来年は2023/10/08(日)開催予定!
  • 大LT出たい。いつもみてて思う…
  • 京急蒲田は蒲田(JR)ではないよ、品川-京急蒲田は快特が良いよ(各停乗るな)
  • 品川で、出口(JR乗り換え)に行くな、普通の出口に行こう。
  • 泊まりができれば飲めるよ🍺
  • 子供入場できるよ👶
  • 早割こだまグリーン車良い🙆のぞみだと乗り換えの待ちがあるので20分しか変わらなかった。

 

おまけ

symfony/pantherでスクレイピングしてみた(Twitterのエゴサ結果をスクショする)

 

PHPカンファレンス沖縄2022でたつきちさんの発表を見て、

symfony/pantherでスクレイピングしたくなったので使ってみしました!
超簡単でした!!!SymfonyアプリでなくプレーンなPHPでも使えるの良いです🙆

準備

$ composer req symfony/panther
$ composer require --dev dbrekelmans/bdi

Twitterで「kin29.info」を検索し、結果をスクショしてみる(エゴサ)

twitterSearch.php

<?php
use Symfony\Component\Panther\Client;

require __DIR__.'/vendor/autoload.php';

$client = Client::createFirefoxClient();

//Twitterで「kin29.info」を検索
$client->request('GET', 'https://twitter.com/search?q=kin29.info&src=typed_query&f=live');

//読み込みがかかるので、必要なElementができるまで待つようにする
$client->waitForVisibility('section > div[aria-label="タイムライン: タイムラインを検索"]');

//スクショをとる
$client->takeScreenshot('screen.png');

echo 'done';

無事にスクショが撮れましたー🎉
ただ、スクショのサイズが小さいのでフルスクリーンでしたかったですが、やり方がわからず😭

普段Symfony書いているPHPerがLaravel入門してみた

 

お久しぶりです!年末年始にゆる〜くLaravelを触ってみました。
普段はSymfonyを書いているので、比較してみました。

間違っていることや補足コメントくれると嬉しいです!!

https://github.com/kin29/example-laravel-app

migrationファイル

  • Laravel: SQLではない。
  • Symfony: SQL。

コマンド

  • Laravel: php artisan ~
  • Symfony: php bin/console ~
    個人的にartisanっていう単語がなかなか覚えられない🤯

ルーティング

  • Laravel: routes/以下にルーティング定義をする。これによりControllerを作成しなくともルーティング設定ができる。

ref: https://readouble.com/laravel/8.x/ja/routing.html

  • Symfony: Controllerに直接ルーティング定義ができる。yamlによるルーティング定義もできる。

ref: https://symfony.com/doc/current/routing.html

PHPStormのコード補完

フォームリクエスト

  • Laravel: FormRequestを作る(Illuminate\Foundation\Http\FormRequestをextends)
$ php artisan make:request StorePostRequest

実際のdiff: https://github.com/kin29/example-laravel-app/commit/b50df00ccd299284c9207be38c03ebe7ac38914e

  • Symfony: FormTypeを作る(Symfony\Component\Form\AbstractTypeをextends)
$ bin/console make:form

データと移入

  • Laravel: seederというアプリケーション実行に必要なデータを投入できる。factoryでも大量のデータ投入ができる
$ php artisan make:seeder UserSeeder
$ php artisan make:factory PostFactory

ORM

  • Laravel: Eloquentモデル(Eloquent ORM)
$ php artisan make:model Flight //model作成
  • Symfony: Entity(Doctrine ORM)
$ bin/console make:entity //Entity作成

 

ぺチコン2021レポート〜1日目〜

 

今年もぺチコンに参加させてもらいました!(オンライン)
オンラインなので👶がいる私には参加しやすかったです〜
YouTubeでアーカイブも残ってるのもありがたいです!何度も見直しますね(きっと)

今回初めてDiscordも活用させていただきました。リアルタイムでいろんな達人の方々が補足してくれるのでめちゃくちゃ勉強になりました!!!
また、会社のスポンサーツアーにもちょこっと出させてもらいました〜🙌

\ ぺチコン2021のタイムテーブルはこちら /
https://fortee.jp/phpcon-2021/timetable

コロナと落ち着いたら、またオフラインで参加したいです🥺
\ 過去のぺチコンレポートをどうぞ /
https://kin29.info/tag/phpcon/

気になったトークのメモ

🟡PHPにおけるコーディング規約と自動整形

コーディング規約の重要性を再確認させてもらいました。

php-cs-fixerとphp_codesnifferの違いについての理解は曖昧だったので、Discord上での解説もあり超納得でした!

php-cs-fixer → 書式しか見ないが全てを自動修正できる

php_codesniffer → 構造も見るのでeraly exitとかも違反にできるが、全ては自動修正できないより厳しくできる

🟡独自フレームワークPHPアプリケーションの改善戦略

auto_prepend_fileっていう設定ができるの初知りでした!auto_prepend_fileについて別記事書いたので良かったらみてください。

PHPのauto-prepend-fileを設定して、symfony/var-dumperを使ってみる

🟡PHPer が知るべき MySQL クエリチューニング

SQL苦手系PHPerなのでめちゃくちゃ勉強になりました。EXPLAINの見方はよく知らなかったので、わかりやすい説明で大変理解できました!

会社の技術ブログで実際に手を動かしてEXPLAIN使って見たレポを書いたので良かったら見てください。
https://tech.quartetcom.co.jp/2021/10/07/phpcon-2021-report/

🟡PHPで学ぶオブジェクト指向プログラミング入門

いい声なので動画貼っておきます。https://youtu.be/gdCE-UGqeSM?t=18952
変数名、関数名だけでも抽象化は表現できる!
複雑さ=条件分岐 → わかりやすくする=条件分岐を減らす
異なるものを同じように扱う事=ポリモーフィズム
JankenGameのコードはdisplayLangResolverを追加したい!って思ってしまいました。
Smalltalkっていう言語のOOP流派もある(←普段使わない方)
ポリモーフィズムは3つある。サブタイプポリモーフィズム/パラメトリックポリモーフィズム/アドホックポリモーフィズム
いつも通り、成瀬さんの説明はめちゃくちゃわかりやすいです。DDDの本読みました!
「OOPって何?なんでいいの?」って聞かれたらおすすめしたいトークです。

🟡ドメインをモデリングして PHP コードに落とし込む

新原さんも声もいい☺️https://youtu.be/gdCE-UGqeSM?t=23609
例題のドメインがワクチン接種なのが現代的!でコードも見れてわかりやすかった!

モデリング→複数の視点(俯瞰でみるかその中の要素でみるか)、手法で徐々に形にしていく
– ユースケース図 …システム化の範囲、ユーザが見えてくる
– 用語集の作成(ちょっと面倒) …項目は用語/英語表記/内容。英語表記があることでコード上での表記ゆれを防ぐ。解釈のずれがなくなるのでおすすめとのこと。
– 概念モデル図 …クラス図。多重度がわかる。用語を適当にばーっと並べて線で結ぶことからはじめて、徐々にブラッシュアップしていく感じ。
UML図ちゃんとは書いたことない。。。💦

ドメインモデル実装
– 1ドメイン = 1クラス
– POPO(Plain Old PHP Odject)、プレーンなPHPで作成
– クラス名やメソッド名にドメインモデル用語を使う
– setterを作らない方が良い …ドメインロジックによってプロパティ値を変更する

日本語クラスは作ったことないのでやってみたい!PHPStormはバリバリ対応してるらしい。

モデリングしてコードを実装することで理解が深まる、コードを書いてて気づくことが多いのはめちゃわかる!
→モデリングの一環としてコードを書くことと、結構良い!テストで実行検証できるのも良い🙆‍♀️

ステータスの状態遷移図もあると便利。
Enumは型としても使える、日本語も使える!
まずは、用語集→ユースケース図が良さそう、用語集でドメイン知識の認識を合わせることが重要💡
図やドキュメントのメンテは? → Wikiレベルで良い、とりあえずあれば嬉しい。

何度も見返したいトークでした!!!🙇‍♂️

🟡【IMO】コードレビューって難しいよね

IMO=in my option 私の意見では
わたしもレビューされる方が好きです。
レビューしてもらうとその分学びが増える感じが好きです。
pullpanda使ったことないので、使って見たいと思いました!
https://pullpanda.com/

さいごに

二日目レポートも書きます!(きっと)

PHPのauto-prepend-fileを設定して、symfony/var-dumperを使ってみる

 

ぺチコン2021を見ていて、初めて知ったビルドインのオプションを知りました!
\ auto-prepend-fileです! /
今回はそれを使って開発を便利にしていきたいと思いますー🙋‍♂️

教えてくださったスライドはこちらです、ありがとうございます!
https://speakerdeck.com/tzmfreedom/original-framework-php-kaizen?slide=22

簡単にできる事を説明すると、独自関数などを定義したファイルをスクリプト実行前に読み込ませることができます!
それにより、デバック関数を独自に作成して、それをスクリプト内に仕込んでデバックするみたいなことができて便利みたいです。

auto-prepend-fileとは?

https://www.php.net/manual/ja/ini.core.php#ini.auto-prepend-file

auto_prepend_file string
メインファイルの前に自動的に付加されるファイルの名前を指定します。 このファイルは、require 関数のコール時と同様に読み込まれます。 このため、include_path が使用されます。
特別な値 none を指定すると、ファイルを前に追加する機能は無効となります。

逆に、auto_append_fileというのもあるみたいです。

🚨注意

auto-prepend-fileauto_append_fileもexit();が使われるようなスクリプトでは、使用できないとのことです。私はここの中身みたいなーって時は、var_dump($hoge);exit();としちゃってたので注意しないとでした。そういうときはdd($hoge);を使うといいみたいですね。

symfony/var-dumperが使えるようにauto-prepend-fileに追加してみる

Symfonyの公式にも掲載されていました!
https://symfony.com/doc/current/components/var_dumper.html#the-dump-function

In order to have the dump() function always available when running any PHP code, you can install it globally on your computer:

  1. Run composer global require symfony/var-dumper;
  2. Add auto_prepend_file = ${HOME}/.composer/vendor/autoload.php to your php.ini file;
  3. From time to time, run composer global update symfony/var-dumper to have the latest bug fixes.

 

1.composer global require symfony/var-dumper;

PHP8.0.3でやっていきます。

$ php --version
PHP 8.0.3 (cli) (built: May 27 2021 13:40:53) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.3, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.3, Copyright (c), by Zend Technologies
    with Xdebug v3.0.3, Copyright (c) 2002-2021, by Derick Rethans


$ composer global require symfony/var-dumper;
Changed current directory to /Users/shigaayano/.composer
Using version ^5.3 for symfony/var-dumper
./composer.json has been created
Running composer update symfony/var-dumper
Loading composer repositories with package information
Updating dependencies
Lock file operations: 3 installs, 0 updates, 0 removals
  - Locking symfony/polyfill-mbstring (v1.23.1)
  - Locking symfony/polyfill-php80 (v1.23.1)
  - Locking symfony/var-dumper (v5.3.8)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 0 installs, 3 updates, 31 removals
  - Removing symfony/stopwatch (v5.1.2)
  - Removing symfony/service-contracts (v1.1.5)
  - Removing symfony/process (v5.1.2)
  - Removing symfony/polyfill-php73 (v1.11.0)
...

2.php.iniにauto_prepend_file = ${HOME}/.composer/vendor/autoload.phpを追加

php -r "echo phpinfo();" | grep "php.ini"でphp.iniの場所を確認して、最終行とかに追記します。

ちゃんと適用されてるか心配だったので、確認して見ます。
設定されてるみたいです。

php -r "echo phpinfo();" | grep "auto_prepend_file"
auto_prepend_file => /Users/xxx/.composer/vendor/autoload.php => /Users/xxx/.composer/vendor/autoload.php

3.実際に使ってみる

まず、dd($hoge);を使って見ます。
今回、コントローラ内でdd($form)でFormの中身を見たかったのですが、dump後にexitされるためdumpが出力された後はレスポンスも表示されません。

次に、dump($hoge);を使って見ます。
exitされないため、レスポンスがいつも通り表示されてSymfony Profiler > Debugからdumpを確認できます。

 

プロジェクト内のコードを変更せず使えますし、便利なので今後も開発で是非使っていこうと思います🙌!

参考:
https://zenn.dev/kitar/articles/790933413a3090116be8

Constructor property promotionを使ってみる!(PHP8から使えるやつ)

 

お久しぶりです…そろそろ更新頻度上げていきたいと思っております🙇‍♂️

今回はPHP8から使えるようになった、Constructor property promotionを使って見たので、差分と使って見た感想をまとめてみます。

Constructor property promotionとは?

https://www.php.net/releases/8.0/en.php#constructor-property-promotion

👆のPHP7→PHP8の差分を見ての通り、簡潔に言うとコンストラクタの引数にすべてを詰め込めます。コンストラクタの引数にプロパティ定義、初期値もかけちゃいます。

実際にDj-Kin29で適用した差分

詳細: https://github.com/kin29/dj-kin29/pull/34/files

before

class DefaultController extends AbstractController
{
    private AuthHandler $authHandler;
    private GetTopTrackService $getTopTrackService;
    private CreatePlaylistService $createPlaylistService;

    public function __construct(
        AuthHandler $authHandler,
        GetTopTrackService $getTopTrackService,
        CreatePlaylistService $createPlaylistService
    ) {
        $this->authHandler = $authHandler;
        $this->getTopTrackService = $getTopTrackService;
        $this->createPlaylistService = $createPlaylistService;
    }

after

class DefaultController extends AbstractController
{
    public function __construct(
        private AuthHandler $authHandler,
        private GetTopTrackService $getTopTrackService,
        private CreatePlaylistService $createPlaylistService
    ) {
    }

このコード見てて気づきましたが、AbstractControllerをextendsするのやめたいなーと思いました。

使って見た感想

👆のコードを見ての通り、6行もコードが減りました!!!スッキリさせたい私的には大変いい感じです。
慣れるまでは違和感がありましたが、実際に使ってみるとなんだかんだすぐ慣れそうな気がしました。
TypeScriptのコンストラクタの書き方と似てます 💡

dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicudata.67.dylibのエラーでPHP7.4が突然使えなくなった話



ある日、突然MacでPHP7.4.9が使えなくなりました😭😭😭
結構ハマりましたが、お戻りになってきてくれました🙌

結論

icu4cが69.1にあがってしまっていた。
→ brewで67.1を入れ直して、シンボリックリンクを貼ればok

エラー内容

$ php --version
dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicudata.67.dylib
Referenced from: /Users/user_xxx/.phpenv/versions/7.4.9/bin/php
Reason: image not found
Abort trap: 6

とりあえず/usr/local/opt/icu4c/lib/libicudata.67.dylibが本当にないのか、
/usr/local/opt/icu4c/lib/以下を確認。
→現在のシンボリックが69.1しかないので、67のシンボリックリンクを作りたい。。。🤤

$ ll /usr/local/opt/icu4c/lib/
total 137024
drwxr-xr-x 28 user_xxx staff 896 4 8 09:10 .
drwxr-xr-x 12 user_xxx staff 384 5 27 17:27 ..
drwxr-xr-x 6 user_xxx staff 192 4 8 09:10 icu
-r--r--r-- 1 user_xxx staff 28672096 5 27 16:15 libicudata.69.1.dylib
lrwxr-xr-x 1 user_xxx staff 21 4 8 09:10 libicudata.69.dylib -> libicudata.69.1.dylib
-r--r--r-- 1 user_xxx staff 28665232 4 8 09:10 libicudata.a
lrwxr-xr-x 1 user_xxx staff 21 4 8 09:10 libicudata.dylib -> libicudata.69.1.dylib
-rw-r--r-- 1 user_xxx staff 2726984 5 27 16:15 libicui18n.69.1.dylib
lrwxr-xr-x 1 user_xxx staff 21 4 8 09:10 libicui18n.69.dylib -> libicui18n.69.1.dylib
...

1.brewでicu4cの67をいれる。

brew tap-newとかbrew extractを使うやり方をしらなくてハマりました。

$ brew tap-new kin29/taps #「kin29」の部分はなんでもokです
Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/kin29/homebrew-taps/.git/
[main (root-commit) 58a4f09] Create kin29/taps tap
3 files changed, 88 insertions(+)
create mode 100644 .github/workflows/publish.yml
create mode 100644 .github/workflows/tests.yml
create mode 100644 README.md
==> Created kin29/taps
/usr/local/Homebrew/Library/Taps/kin29/homebrew-taps

When a pull request making changes to a formula (or formulae) becomes green
(all checks passed), then you can publish the built bottles.
To do so, label your PR as `pr-pull` and the workflow will be triggered.
$ brew extract icu4c kin29/taps --version 67
==> Searching repository history
==> Writing formula for icu4c from revision e2c833d to:
/usr/local/Homebrew/Library/Taps/kin29/homebrew-taps/Formula/icu4c@67.rb
$ brew install kin29/taps/icu4c@67
==> Installing icu4c@67 from kin29/taps
==> Downloading https://github.com/unicode-org/icu/commit/715d254a02b0b22681cb6f861b0921ae668fa7d6.patch?full_index=1
Already downloaded: /Users/user_xxx/Library/Caches/Homebrew/downloads/0dd175e315a7eee5f9fb42af4e03d2130e3a3aa130db4d2b32a58b1c88d87251--715d254a02b0b22681cb6f861b0921ae668fa7d6.patch
==> Downloading https://github.com/unicode-org/icu/releases/download/release-67-1/icu4c-67_1-src.tgz
Already downloaded: /Users/user_xxx/Library/Caches/Homebrew/downloads/5652b331b5400231692d0879d41522870a20598d8771342b622d543c2ed99ca0--icu4c-67_1-src.tgz
==> Patching
==> Applying 715d254a02b0b22681cb6f861b0921ae668fa7d6.patch
patching file source/common/uassert.h
==> ./configure --prefix=/usr/local/Cellar/icu4c@67/67.1 --disable-samples --disable-tests --enable-static --with-library-bits=64
==> make
==> make install
==> Caveats
icu4c@67 is keg-only, which means it was not symlinked into /usr/local,
because macOS provides libicucore.dylib (but nothing else).

If you need to have icu4c@67 first in your PATH, run:
echo 'export PATH="/usr/local/opt/icu4c@67/bin:$PATH"' >> /Users/user_xxx/.bash_profile
echo 'export PATH="/usr/local/opt/icu4c@67/sbin:$PATH"' >> /Users/user_xxx/.bash_profile

For compilers to find icu4c@67 you may need to set:
export LDFLAGS="-L/usr/local/opt/icu4c@67/lib"
export CPPFLAGS="-I/usr/local/opt/icu4c@67/include"

For pkg-config to find icu4c@67 you may need to set:
export PKG_CONFIG_PATH="/usr/local/opt/icu4c@67/lib/pkgconfig"

==> Summary
🍺 /usr/local/Cellar/icu4c@67/67.1: 258 files, 71.8MB, built in 4 minutes 47 seconds

icu4c@67がインストールされたことを確認!

$ ll /usr/local/Cellar/ | grep icu
drwxr-xr-x 4 user_xxx staff 128 5 27 16:15 icu4c
drwxr-xr-x 3 user_xxx admin 96 5 29 18:04 icu4c@67
$ ll /usr/local/opt/ | grep icu4c
lrwxr-xr-x 1 user_xxx admin 20 5 27 16:15 icu4c -> ../Cellar/icu4c/69.1
lrwxr-xr-x 1 user_xxx admin 23 5 29 18:09 icu4c@67 -> ../Cellar/icu4c@67/67.1 #今回追加分

2.シンボリックリンクを貼る⚠️

ln -s [パス] [リンク名]です。私はパスとリンク名の指定が逆と勘違いしていて、ハマりました💦
(間違えたらunlink [リンク名]で削除できます。)

$ cd /usr/local/opt/icu4c/lib/
$ ln -s ../../../icu4c@67.1/67.1/lib/libicuio.67.1.dylib libicuio.67.dylib
$ ln -s ../../../icu4c@67.1/67.1/lib/libicui18n.67.1.dylib libicui18n.67.dylib
$ ln -s ../../../icu4c@67.1/67.1/lib/libicuuc.67.1.dylib libicuuc.67.dylib
$ ln -s ../../../icu4c@67.1/67.1/lib/libicudata.67.1.dylib libicudata.67.dylib
$ ln -s ../../../icu4c@67.1/67.1/lib/libicutest.67.1.dylib libicutest.67.dylib
$ ln -s ../../../icu4c@67/67.1/lib/libicutu.67.1.dylib libicutu.67.dylib

シンボリックリンクが貼れていることを確認します。

$ ll /usr/local/opt/icu4c/lib/ | grep 67.dy
lrwxr-xr-x 1 user_xxx staff 50 5 29 22:11 libicudata.67.dylib -> ../../../icu4c@67.1/67.1/lib/libicudata.67.1.dylib
lrwxr-xr-x 1 user_xxx staff 50 5 29 22:09 libicui18n.67.dylib -> ../../../icu4c@67.1/67.1/lib/libicui18n.67.1.dylib
lrwxr-xr-x 1 user_xxx staff 48 5 29 22:08 libicuio.67.dylib -> ../../../icu4c@67.1/67.1/lib/libicuio.67.1.dylib
lrwxr-xr-x 1 user_xxx staff 50 5 29 22:09 libicutest.67.dylib -> ../../../icu4c@67.1/67.1/lib/libicutest.67.1.dylib
lrwxr-xr-x 1 user_xxx staff 46 5 29 22:09 libicutu.67.dylib -> ../../../icu4c@67/67.1/lib/libicutu.67.1.dylib
lrwxr-xr-x 1 user_xxx staff 48 5 29 22:09 libicuuc.67.dylib -> ../../../icu4c@67.1/67.1/lib/libicuuc.67.1.dylib

 

PHP7.4お戻りになってくれたー😭😭😭ありがとう🎊

php --version
PHP 7.4.9 (cli) (built: Dec 26 2020 23:21:06) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Zend OPcache v7.4.9, Copyright (c), by Zend Technologies
with Xdebug v3.0.1, Copyright (c) 2002-2020, by Derick Rethans

 

助けてくれてありがとうございました🙇‍♂️
ref: https://www.tohuandkonsome.site/entry/2021/05/21/173612