Задать вопрос
savostin
@savostin
Еще один программист

Как получить контейнер php-di в «не-контроллере»?

В 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 и не в котроллере.
  • Вопрос задан
  • 77 просмотров
Подписаться 1 Средний 5 комментариев
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы