В PHP-DI делаю injection некоего класса TransactionsCollection implements ITransactionsCollection:
# Model/ITransactionsCollection.php
namespace Model;
use Model\Transaction;
interface ITransactionsCollection
{
public function __construct();
public function add(Transaction $transaction) : bool;
}
# app.php
use DI\ContainerBuilder;
use function DI\factory;
use Model\ITransactionsCollection;
use Collection\TransactionsCollection;
$containerBuilder = new ContainerBuilder;
$containerBuilder->addDefinitions([
ITransactionsCollection::class => factory(function () {
return new TransactionsCollection();
}),
]);
$container = $containerBuilder->build();
use Model\TransactionsCollection;
class Account
{
private TransactionsCollection $transactions;
public function __construct()
{
$this->transactions = ???; // надо вызвать конструктор имплементации ITransactionsCollection
}
}
По документации нужно писать
$container->get(ITransactionsCollection::class);
и оно должно вызвать фабрику. Но где взять этот $container? Он остался на "самом верху" приложения.
P.S. Это не Slim, нет $app->getContainer()
В контроллере все ижектится "автоматически":
$containerBuilder->addDefinitions([
IRepository::class => DI\create(Repository::class),
]);
class MyController
{
private IRepository $repository;
public function __construct(IRepository $repository)
{
$this->repository = $repository;
}
}
Но в Account мне нужно именно создавать TransactionsCollection (вызывать factory), а не получать созданный, как Repository в MyController.
Собственно вопрос, как получить $controller в конструкторе Account или я что-то делаю нет так в принципе? Не могу найти примера работы с php-di + factory без slim и не в котроллере.