構成ビルダーはどうですか?

in Vlog

(CJP) 私は最近、趣味のプロジェクトをいじっています。それは、PHP 8 に慣れるための小さなフレームワークであり、頭に浮かんだランダムなアイデアを試してみることです。 それほど深刻ではありませんが、楽しいエクササイズです。

これらのアイデアのほとんどは、Laravel を使った日々の経験から生まれました。より具体的には、私が Laravel で抱えている小さな煩わしさから生まれました。 誤解しないでほしいのですが、最新の PHP 開発に関して言えば、Laravel は最高のフレームワークの 1 つだと思います。

したがって、これは間違いなくLaravelの暴言ではなく、これらの小さな煩わしさの1つに対処するための単なる思考実験です.

つまり、Laravel にはこれらの PHP 構成ファイルがあります。 これが一例です(これは auth.php、疑問に思っている場合):

‘guard’ => ‘web’,
‘passwords’ => ‘users’,
],

‘guards’ => [
‘web’ => [
‘driver’ => ‘session’,
‘provider’ => ‘users’,
],

‘api’ => [
‘driver’ => ‘token’,
‘provider’ => ‘users’,
‘hash’ => false,
],
],

‘providers’ => [
‘users’ => [
‘driver’ => ‘eloquent’,
‘model’ => App\Models\User::class,
],

],

‘passwords’ => [
‘users’ => [
‘provider’ => ‘users’,
‘table’ => ‘password_resets’,
‘expire’ => 60,
‘throttle’ => 60,
],
],

‘password_timeout’ => 10800,

];

PHP 構成ファイルは、たとえば YAML や XML 構成よりもはるかに優れていると思います。 それに関して私を非常に悩ませていることが 1 つあります。それは、必要な値のタイプは言うまでもなく、この配列で使用できる構成値の種類に関する IDE の洞察がないことです。

この問題に対処するために、公式の Laravel 構成ファイルには、各構成エントリを説明するこれらのインライン doc ブロックがあります。 ほとんどの本格的なサード パーティ製パッケージも、このようなドキュメント ブロックを提供しています。

ただし、PHP 8 と名前付き引数を使用すると、より優れた解決策が利用可能になります。必要なデータの種類を正確に認識している構成オブジェクトです。

これが私が想像するものです auth.php 次のようになります。

return AuthConfig::make()
->defaults(
guard: ‘web’,
passwords: ‘users’,
)
->guards(
web: GuardConfig::make()
->driver(‘session’)
->provider(‘users’),
api: GuardConfig::make()
->driver(‘token’)
->provider(‘users’)
->hash(false),
)
->providers(
users: AuthProviderConfig::make()
->driver(‘eloquent’)
->model(User::class),
)
->passwords(
users: PasswordConfig::make()
->provider(‘users’)
->table(‘password_resets’)
->expire(60)
->throttle(60)
)
->passwordTimeout(10800);

名前付き引数と可変引数関数のサポートのおかげで、最終的にはより簡潔な構文になりますが、すべてのドキュメントを利用できます: 構成ファイルにハードコードされるのではなく、これらの構成オブジェクトにプロパティ タイプとドキュメント ブロックとして追加されます。テキストとして。

私にとってこれが最も重要な価値です。インラインまたは外部のドキュメントを読む代わりに、IDE が何をする必要があるかを教えてくれます。

これが機能するために必要な唯一のものは、これらの構成ビルダーを必要とするある種のインターフェースです。 toArray 方法。 さらに一歩進んで、配列の代わりに構成オブジェクトを常に使用することで状況を好転させることができます。これにより、構成を初期化するときだけでなく、構成を読み取るときに組み込みのドキュメントも利用できるようになります。 ただし、これはもう少し積極的な変更です。

構成ビルダーの実装は次のようになります。

class AuthConfig extends ConfigBuilder

public function defaults(
?string $guard = null,
?string $password = null,

): self
$this->config[‘defaults’][‘guard’] =
$guard
?? $this->config[‘defaults’][‘guard’] ?? null;

$this->config[‘defaults’][‘password’] =
$password
?? $this->config[‘defaults’][‘password’] ?? null;

return $this;

public function guards(GuardConfig …$guardConfigs): self

foreach ($guardConfigs as $name => $guardConfig)
$this->config[‘guards’][$name] = $guardConfig->toArray();

return $this;

public function passwordTimeout(int $timeout): self

$this->config[‘password_timeout’] = $timeout;

return $this;

もう 1 つの改善策は、文字列値の代わりに列挙型を使用することです。 これらは PHP 8.1 でネイティブに利用できるようになりますが、古い PHP バージョン用の代替手段もあります。

すでに PHP 8.1 を実行していると仮定して、その一部を次のように記述できます。

->guards(
web: GuardConfig::make()
->driver(Driver::Session)
->provider(Provider::Users),
api: GuardConfig::make()
->driver(Driver::Token)
->provider(Provider::Users)
->hash(false),
)

ところで、これらのアイデアは新しいものではありません。 Spatie の一部のパッケージで構成オブジェクトを使用してきましたが、常に単純な配列から開始し、アプリケーションの起動時にそれを変換します。 同じアプローチを使用する PHP CS もあります。 また、Symfony は最近、構成ファイルを構築するための流暢なインターフェースのサポートを追加しました。 すごい!

tpyoに気づきましたか? PR を送信して修正することができます。 このブログの最新情報を知りたい場合は、私をフォローしてください。 ツイッター または私のニュースレターを購読してください:

独自のフレームワークをいじることには、1 つの利点があります。それは、下位互換性やレガシーに制約されないことです。 少なくともデフォルトのアプローチとしてではなく、Laravelで構成ビルダーを適切にサポートすることは簡単ではないかもしれないと思います. また、PHP 8 を必要とする名前付き引数を使用できない場合は、あまり役に立ちません。

しかし、誰が知っていますか? 将来、Laravelに同様のものが追加される可能性がありますか? あるいは、一部のサードパーティのパッケージが最初に独自に開始する場合もあります。 とにかく、楽しみのために、カスタム フレームワークをもう少しいじってみます。

構成ビルダーについてどう思いますか? あなたの考えを教えてください。 ツイッター または私のニュースレターを購読することによって。

関連記事

前の投稿
パナマの国旗: 歴史、意味、象徴
次の投稿
世界記録マグロ:これまでに捕獲された最大のマグロを発見