Я пытаюсь использовать ray di для ввода данных в конструктор. Но у меня есть некоторые проблемы. Вот мой код
<?php
declare(strict_types=1);
namespace App\action;
require __DIR__ . '../../../vendor/autoload.php';
use Ray\Di\AbstractModule;
use Ray\Di\Injector;
interface DbInterface
{
}
class Db implements DbInterface
{
private $dsn;
private $username;
private $password;
public function __construct($dsn,$username,$password)
{
$this->dsn = $dsn;
$this->username = $username;
$this->password = $password;
}
}
class PostgreDb implements DbInterface
{
private $dsn;
private $username;
private $password;
public function __construct($dsn,$username,$password)
{
$this->dsn = $dsn;
$this->username = $username;
$this->password = $password;
}
}
class FinderModule extends AbstractModule
{
protected function configure()
{
$this->bind(Db::class)->toConstructor(Db::class, ['dsn'=>'dsn','username'=>'username','password'=>'password']);
$this->bind(PostgreDb::class)->toConstructor(PostgreDb::class, ['dsn'=>'dsn','username'=>'username','password'=>'password']);
$this->bind()->annotatedWith('dsn')->toInstance('msql:host=localhost;dbname=test');
$this->bind()->annotatedWith('username')->toInstance('root');
$this->bind()->annotatedWith('password')->toInstance('52');
}
}
$dbName = PostgreDb::class;
$injector = new Injector(new FinderModule);
$temp = $injector->getInstance($dbName);
print_r( $temp );
Теперь я использую два класса Db
& PostgreDb
. Позже я планирую использовать новые классы, такие как MysqlDb
, SqliteDb
et c. И я не хочу менять configure()
каждый раз, когда создаю новый класс.
Кто-нибудь может мне помочь? Спасибо.