Анонимная функция PDO внутри Factory

В этом вопрос здесь, в S.O, принятый ответ предлагает использовать как анонимную функцию, так и фабричный шаблон для работы с PDO-соединением. Я считаю, что анонимная функция используется в случае, если необходимо установить соединение с другой базой данных, для этого будет определена другая функция. В таком случае, можно ли переместить анонимную функцию в сам класс фабрики только для одной базы данных?

Это то, что я имел в виду

class StructureFactory
{
protected $provider = null;
protected $connection = null;

public function __construct( )
{
$this->provider = function() {
$instance = new PDO('mysql:......;charset=utf8', 'username', 'password');
$instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$instance->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
return $instance;
};
}

public function create( $name )
{
if ( $this->connection === null )
{
$this->connection = call_user_func( $this->provider );
}
return new $name( $this->connection );
}

}

Кроме того, даже при таком подходе, почему бы просто не передать параметры PDO конструктору для достижения того, чего пытался достичь первоначальный ответ, то есть для установления различных соединений?

Что-то вроде:

class StructureFactory
{
protected $provider = null;
protected $connection = null;

public function __construct( $PDO_Params )
{
$this->provider = function() {
$instance = new PDO($PDO_Params["dsn"], $PDO_Params["username"], $PDO_Params["password"]);
$instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$instance->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
return $instance;
};
}

public function create( $name)
{
if ( $this->connection === null )
{
$this->connection = call_user_func( $this->provider );
}
return new $name( $this->connection );
}

}

0

Решение

Нет. Потому что таким образом вы теряете любые выгоды от внедрения зависимости.

Модификация, которую вы могли бы сделать: внедрить инициализированный экземпляр PDO непосредственно на фабрике, вместо того, чтобы использовать этот подход с отложенной загрузкой. Вроде как в этот ответ.

Я также рекомендовал бы смотреть эта лекция.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector