PHPackages                             ryunosuke/castella - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. ryunosuke/castella

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

ryunosuke/castella
==================

php dependency injection container

v2.0.4(11mo ago)0126MITPHPPHP &gt;=8.0

Since Jul 10Pushed 11mo ago1 watchersCompare

[ Source](https://github.com/arima-ryunosuke/php-di-configure)[ Packagist](https://packagist.org/packages/ryunosuke/castella)[ RSS](/packages/ryunosuke-castella/feed)WikiDiscussions master Synced 1mo ago

READMEChangelogDependencies (4)Versions (15)Used By (0)

php configuration and DI container
==================================

[](#php-configuration-and-di-container)

Description
-----------

[](#description)

設定ファイルをベースとした DI コンテナです。 下記の機能があります。

- コンストラクタインジェクション
- フィールドインジェクション
- オートワイヤリング
- 上記に伴う循環参照解決

Install
-------

[](#install)

```
{
  "require": {
    "ryunosuke/castella": "dev-master"
  }
}
```

Concept
-------

[](#concept)

- **設定ファイルベース**
    - 「DI コンテナ（＋設定ファイル）」ではなく「設定ファイル（＋DI コンテナ）」です
    - つまり「DI コンテナを設定ファイルのように使いたい」ではなく「設定ファイルを DI コンテナのように使いたい」が基本コンセプトです
- **ミニマム・コンパクト**
    - 複雑な依存は廃し、完全無依存（除 psr11）＋数ファイルで構成されます
    - 最悪の場合は「コピペでコードベースを変更できる」を仮定しています（依存が大量でファイルが100を超えていたりするとこうは行かない）
- **シンプル**
    - 「あらゆる注入をサポートする」のではなく、「DI コンテナに合わせてクラス設計する」という方針です。あまり無節操に外部のオブジェクトを取り込むような設計ではありません
    - サポートする機能は「コンストラクタインジェクション」「フィールドインジェクション」「オートワイヤリング」だけです
    - 「セッターインジェクション」「アノテーション」「メソッドコール」などは実装されていませんし、今後実装する予定もありません
    - コンパイル・変換などはありません。十分に高速です
- **簡潔**
    - 設定ファイルの記法は「値を書く」か「クロージャ（ファクトリ）を書く」かだけです（利便性のための糖衣構文はある）
    - 値の場合はそのまま活かされますし、クロージャ（ファクトリ）の場合は遅延実行されます

Spec
----

[](#spec)

- コンテナに設定するデータソースは配列（or 配列を返すファイル）のみです
    - 一応 `set` も用意してありますが、内部的には配列です
- 配列はキー単位でマージ（上書き）されます
    - 連想配列・連番配列の区別はありません。よって連番配列のマージは意図しない結果になることがあります
    - 完全に上書きされる配列を定義したい場合はクロージャで包むか array メソッドを使う必要があります
- 「値」とは「クロージャ以外のすべて」を指します。値は設定したものがそのまま返されます
- クロージャは原則的に遅延実行されます。つまり「必要になったその時」まで実行されません
    - よってエントリにクロージャを設定したい場合は「クロージャを返すクロージャ」を設定する必要があります
    - クロージャの値としての型は「型宣言による返り値の型」です。これによりクロージャを実行せずとも型の判定を可能にしています
    - 返り値の型を記述しないと void となり、依存関係の解決の対象外となります
    - static クロージャにすると毎回同じインスタンスを返します。 static ではない普通のクロージャは毎回生成して返します
- `closureAsFactory` を false にすると上記の前提がなくなり、クロージャは本当の「値」として扱われ、ファクトリのための遅延実行は #\[Factory\] 属性を使用します
- `closureAsFactory` が true でも #\[Entry\] 属性を付与すると値になります
- クロージャの引数は `(コンテナ, キー逆順)` で固定です
    - クロージャの引数で型検出はされない、ということです
    - この仕様は設定のコンテキストのすべてのクロージャに適用されます
- ファクトリの引数は `(...キー逆順)` で固定です
    - この仕様は設定のコンテキストのすべてのクロージャに適用されます

Usage
-----

[](#usage)

### 基本

[](#基本)

このパッケージは端的に言えば「依存関係を解決できるコンフィグレーションライブラリ」です。 環境や開発者間での設定を吸収する、下記のようなユースケースを想定しています。

まず、下記のようなデフォルト設定があるとします。

```
