toConstructor binding sample - koriym/Ray.Di GitHub Wiki

<?php

require dirname(__DIR__) . '/vendor/autoload.php';

use Ray\Di\AbstractModule;
use Ray\Di\Di\Inject;
use Ray\Di\Di\Named;
use Ray\Di\Injector;

class SolarModule extends AbstractModule
{
    private $options;

    public function __construct($options)
    {
        $this->options = $options;
    }

    /**
     * {@inheritdoc}
     */
    protected function configure()
    {
        // provider binding
        foreach ($this->options as $name => $option) {
            $optionName = "options.solr.{$name}";
            $this->bind(\SolrClient::class)->annotatedWith($name)->toConstructor(
                \SolrClient::class,
                "clientOptions=$optionName"
            );
            $this->bind()->annotatedWith($optionName)->toInstance($option);
        }
    }
}

class IndexPage
{
    /**
     * @var \SolrClient
     */
    private $fooSolrClient;

    /**
     * @var \SolrClient
     */
    private $barSolrClient;

    /**
     * @Inject
     * @Named("foo")
     */
    public function setFooClient(\SolrClient $solrClient)
    {
        $this->fooSolrClient = $solrClient;
    }

    /**
     * @Inject
     * @Named("bar")
     */
    public function setBarClient(\SolrClient $solrClient)
    {
        $this->barSolrClient = $solrClient;
    }

    public function showOptions()
    {
        var_dump($this->fooSolrClient->getOptions()['port']);
        var_dump($this->barSolrClient->getOptions()['port']);
    }
}

$options = [];
$options['foo'] = ['port' => 8080];
$options['bar'] = ['port' => 8081];
$injector = new Injector(new SolarModule($options));
/** @var $page IndexPage */
$page = $injector->getInstance(IndexPage::class);
$page->showOptions();

//int(8080)
//int(8081)