直接依存するものだけを注入する

他のオブジェクトを取得するためだけに、オブジェクトを注入することは避けてください。 例えば、 Account を取得するために Customer をインジェクトするのはやめましょう。

class ShowBudgets
{
    private readonly Account $account;

    public function __construct(Customer $customer)
    {
        $this->account = $customer->getPurchasingAccount();
    }
}

その代わり、依存関係を直接インジェクトします。 これにより、テストケースは Customer を気にする必要がなくなり、テストが容易になります。 Provider クラスを使用して、 Customer の束縛を使用する Account の束縛を作成します。

use Ray\Di\AbstractModule;
use Ray\Di\ProviderInterface;

class CustomersModule extends AbstractModule
{
    protected function configure()
    {
        $this->bind(Account::class)->toProvider(PurchasingAccountProvider::class);
    }
}

class PurchasingAccountProvider implements ProviderInterface
{
    public function __construct(
        private readonly Customer $customer
    ) {}
    
    public function get(): Account
    {
        return $this->customer->getPurchasingAccount();
    }
}

依存関係を直接注入することで、コードがよりシンプルになります。

class ShowBudgets
{
    public function __construct(
        private readonly Account $account
   ) {}
}