Getting Started

哲学を理解したら、実践してみましょう。

要件

  • PHP 8.4+
  • Composer

インストール

git clone https://github.com/be-framework/app my-project
cd my-project
rm -rf .git
composer install

サンプルを実行

php bin/app.php

出力:

Hello World

これだけです!コードを見てみましょう。

プロジェクト構造

src/
├── Input/
│   └── HelloInput.php      # 出発点
├── Final/
│   └── Hello.php           # 目的地
├── Reason/
│   └── Greeting.php        # 超越的な能力
├── Semantic/
│   └── Name.php            # 意味的変数
├── Exception/
│   └── EmptyNameException.php
└── Module/
    └── AppModule.php       # DI設定

コード

Input クラス

#[Be([Hello::class])]
final readonly class HelloInput
{
    public function __construct(
        public string $name
    ) {}
}

#[Be] 属性はこの入力が何になるか、自らの運命を宣言します。

Final クラス

final readonly class Hello
{
    public string $greeting;

    public function __construct(
        #[Input] string $name,
        #[Inject] Greeting $greeting,
    ) {
        $this->greeting = "{$greeting->greeting} {$name}";
    }
}
  • #[Input] は前の段階(HelloInput)からデータを受け取ります。
  • #[Inject] は外部からの能力(トランセンデンス)を受け取ります。

Reason クラス

final class Greeting
{
    public string $greeting = 'Hello';
}

Greeting はトランセンデンス — 挨拶する力—を提供します。

変態(メタモルフォーシス)の実行

$injector = new Injector(new AppModule());
$becoming = new Becoming($injector, 'Be\\App\\Semantic');

$input = new HelloInput('World');
$hello = $becoming($input);

echo $hello->greeting;  // "Hello World"

何が起きたのか?

HelloInput('World')
    ↓ Becoming が実行
Hello (Greeting が注入された状態)
    → "Hello World"

入力オブジェクトは何もしていません — 変態を通じて Hello になった(BEING)のです。

セマンティック検証を試す

bin/app.php を編集して空の名前を渡してみましょう:

$input = new HelloInput('');

再度実行:

php bin/app.php

Semantic/Name.php が名前が空であることを検証するため、エラーメッセージが表示されます。空の名前では存在ができないのです。

示された主要概念

概念 この例では
内在 HelloInput の $name
超越 #[Inject] で注入された Greeting
変態 HelloInput → Hello の変換
セマンティック検証 Name.php が入力を検証

次のステップ

Being クラスと分岐を含むより完全な例に進む準備ができましたか? チュートリアル へ →

または概念を復習: