#php #zend-framework2
#php #zend-framework2
Вопрос:
Я хочу иметь доступ к конфигурации базы данных, установленной в глобальном файле конфигурации в моей модели. В контроллерах ZF2 мы можем загружать конфигурации с помощью getServiceLocator
метода, но как я могу сделать это в моем классе модели? вот мой класс модели:
class BaseModel extends AbstractTableGateway
{
public function __construct()
{
$this->adapter = new Adapter(array(
'driver' => 'Pdo_Mysql',
'database' => 'mydbname',
'username' => 'root',
'password' => 'root'
));
}
}
Я просто хочу загрузить конфигурацию массива ‘db’ (расположенную в глобальном конфигурационном файле) и заменить этим входным массивом в качестве входных параметров класса адаптера.
Вот мой глобальный конфигурационный файл:
return array(
"db" => array(
"driver" => "Pdo_Mysql",
"dsn" => "mysql:dbname=mydbname;host=localhost",
"username" => "root",
"password" => "root"
),
"service_manager" => array(
"factories" => array(
"dbFactory" => "ZendDbAdapterAdapterServiceFactory",
)
)
);
Комментарии:
1. Не было бы лучше передать ваш существующий адаптер DB вместо создания второго соединения?
2. Это именно то, что я хочу сделать… я хочу использовать существующий адаптер ‘db’ (в global.php файл) в моем классе модели как массив параметров адаптера. но я не могу, как я могу загрузить это в свою модель?
3. с помощью этой стратегии мне не нужно создавать функцию, которая возвращает мой класс модели таблицы в каждом запросе в контроллере, вместо этого я наследоваю свою модель таблицы из базовой модели и просто создаю экземпляр из моей модели таблицы в моем контроллере, только это.
Ответ №1:
Если вам нужно изменить DbAdapter
конфигурацию (базу данных, к которой вы подключаетесь), вам нужно будет создать другой экземпляр адаптера, а затем внедрить этот адаптер в вашу «модель»
class FooModel extends AbstractTableGateway
{
public function __construct($dbAdapter)
{
$this->adapter = $adapter;
}
}
Затем создайте фабрики служб адаптера
public function getServiceConfig()
{
return array(
'factories' => array(
// Standard database adapter
'dbAdapter1' => function($sm) {
$config = $sm->get('config');
return new ZendDbAdapterAdapter($config['db']);
},
// Another db adapter using different config
'dbAdapter2' => function($sm) {
$config = $sm->get('config');
return new ZendDbAdapterAdapter($config['db2']);
},
// The model that requires a different database
// adapter to be injected
'FooModel' => function($sm) {
$adapter = $sm->get('dbAdapter2');
return new ModelFooModel($adapter);
},
),
);
}
Затем вы можете добавить всю конфигурацию к db2
ключу либо в глобальном, либо в module.config.php
.