Как получить доступ к глобальному ограничению в классе модели в ZF2

#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 .