provider sample - koriym/Ray.Di GitHub Wiki

<?php

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

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

abstract class AbstractSolarClientProvider implements ProviderInterface
{
    /**
     * {@inheritdoc}
     */
    public function get()
    {
        $solarClint = new SolrClient($this->options);

        return $solarClint;
    }
}

class FooSolarClientProvider extends  AbstractSolarClientProvider
{
    protected $options;

    /**
     * @Named("foo_options")
     */
    public function __construct(array $options)
    {
        $this->options = $options;
    }
}

class SolarModule extends AbstractModule
{
    private $options;

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

    /**
     * {@inheritdoc}
     */
    protected function configure()
    {
        // provider binding
        $this->bind()->annotatedWith("foo_options")->toInstance($this->options['foo']);
        $this->bind(SolrClient::class)->annotatedWith("foo")->toProvider(FooSolarClientProvider::class);
    }
}

class IndexPage
{
    private $solrClient;

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

    public function run()
    {
        var_dump($this->solrClient);
    }
}

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

//class SolrClient#16 (1) {
//  private $_hashtable_index =>
//  int(32421)
//}