コンストラクタ束縛

時には対象のコンストラクタやセッターメソッドがサードパーティ製であるため#[Inject]アトリビュートが適用できない場合や、あるいは単にアトリビュートを使いたくない場合があります。

コンストラクタ束縛はこの問題を解決します。つまり、対象となるコンストラクタの情報をアトリビュートではなく、ユーザー側で明示的に指定することでRay.DIにオブジェクトの生成方法を伝えます。

$this->bind($interfaceName)
    ->toConstructor(
        $className,       // Class name
        $name,            // Qualifier
        $injectionPoint,  // Setter injection
        $postConstruct    // Initialize method
    );

(new InjectionPoints) 
    ->addMethod('setGuzzle')                 // Setter injection method name
    ->addOptionalMethod('setOptionalToken'); // Optional setter injection method name

Parameter

class_name

クラス名

name

パラメーター名束縛

引数に識別子を追加する場合は、キーを変数名、値を識別子とする配列を指定します。

[
	[$paramName1 => $named1],
	[$paramName2 => $named2],
	...
]

以下のストリングフォーマットもサポートされています。 'param_name1=binding_name1&...'

setter_injection

InjectionPointsオブジェクトでセッターインジェクションのメソッド名($methodName)と識別子($named)を指定します。

(new InjectionPoints)
	->addMethod($methodName1)
	->addMethod($methodName2, $named)
  ->addOptionalMethod($methodName, $named);

postCosntruct

コンストラクタとセッターメソッドが呼び出され、すべての依存関係が注入された後に$postCosntructメソッドが呼び出されます

PDO Example

PDOクラスの束縛の例です。

public PDO::__construct(
    string $dsn,
    ?string $username = null,
    ?string $password = null,
    ?array $options = null
)
$this->bind(\PDO::class)->toConstructor(
    \PDO::class,
    [
        'dsn' => 'pdo_dsn',
        'username' => 'pdo_username',
        'password' => 'pdo_password'
    ]
)->in(Scope::SINGLETON);

$this->bind()->annotatedWith('pdo_dsn')->toInstance($dsn);
$this->bind()->annotatedWith('pdo_username')->toInstance(getenv('db_user'));
$this->bind()->annotatedWith('pdo_password')->toInstance(getenv('db_password'));

PDOのコンストラクタ引数は$dsn, $usernameなどstringの値を受け取り、その束縛を区別するために識別子が必要です。しかしPDOはPHP自体のビルトインクラスなのでアトリビュートを加えることができません。

toConstructor()の第2引数の$nameで識別子(qualifier)を指定します。その識別子に対してあらためて束縛を行います。 上記の例ではusernameという変数にpdo_usernameと言う識別子を与え、toInstanceで環境変数の値を束縛しています。