2

Каждый подключенный элемент моего сайта имеет свою базу данных. Вот учение конфигурации для "user_1":zf2 + Doctrine - другая база данных для каждого члена

return array(
'doctrine' => array(
    'connection' => array(
     'orm_default' => array(
      'driverClass' => 'Doctrine\DBAL\Driver\PDOMySql\Driver', 
      'params' => array(
       'host'  => 'localhost', 
       'port'  => '3306', 
       'user'  => 'user_1', 
       'password' => 'psswd_user_1', 
       'dbname' => 'database_user_1', 
       'charset' => 'utf8', 
       'driverOptions' => array (1002 => 'SET NAMES utf8'), 
      )),),),); 

Есть ли способ заменить: 'user_1', 'psswd_user_1' и 'database_user_1' с 'user_x', 'psswd_user_x' и «database_user_x 'для user_x?

Я не знаю, как это сделать! Я хотел бы, чтобы избежать копирования и тот же код для каждого пользователя ...

Спасибо за помощь

ответ

0

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

С немного исходного кода копания, я обнаружил, что эти параметры передаются в DoctrineORMModule\Options\DBALConnection экземпляр и что этот экземпляр создается DoctrineORMModule\Service\DBALConnectionFactory

Вы должны переопределить этот завод с чем-то вроде этого:

<?php 
namespace MyModule\Service; 
use DoctrineORMModule\Service\DBALConnectionFactory; 
use Zend\ServiceManager\ServiceLocatorInterface; 

class MyDBALConnectionFactory extends DBALConnectionFactory 
{ 

    public function getOptions(ServiceLocatorInterface $sl, $key, $name = null) 
    { 
     $options = parent::getOptions($sl, $key, $name); 

     // override for everyone that needs a DBALConnection 
     if ($this->getOptionClass() === 'DoctrineORMModule\Options\DBALConnection') { 

      // set custom parameters here 
      // maybe fetch the current user with $sl->get('...') 
      $params = [/* ... */]; 
      $options->setParams($params); 
     } 

     return $options; 
    } 
} 

И тогда вы просто скажите менеджеру службы об этом:

<?php 
return [ 
    ... 
    'doctrine' => [ 
     'doctrine_factories' => [ 
      'connection' => 'MyModule\Service\DBALConnectionFactory', 
     ] 
    ] 
    ... 
]; 
+0

Bonjour и др Merci ClémentJe vais travailler sur cette piste – user2670354

+0

С удовольствием помогите , Сообщите мне, если этот код не работает должным образом, у нас могут не быть одинаковые версии ZF2 и Doctrine –

+0

Je le ferai bien sûr avec plaisir – user2670354

0

Благодаря Алехандро Селайя. 1st link и 2d link

Надеюсь, это будет полезно. Я знаю, что это не идеально, но я не могу сделать лучше! Я бы хотел критического.

в конфигурации/автозагрузка/doctrine.local.php:

'doctrine' => array(
'connection' => array(
    'orm_default' => array(
     'driverClass' => 'Doctrine\DBAL\Driver\PDOMySql\Driver', 
     'params' => array(
      'host'  => 'localhost', 
      'port'  => '3306', 
      'user'  => 'root', 
      'password' => '', 
      'dbname' => 'gestion_toto_default', 
      'charset' => 'utf8', 
      'driverOptions' => array(1002 => 'SET NAMES utf8'), 
     ) 
    ), 
    'orm_toto_users' => array(
     'driverClass' => 'Doctrine\DBAL\Driver\PDOMySql\Driver', 
     'params' => array(
      'host'  => 'localhost', 
      'port'  => '3306', 
      'user'  => 'root', 
      'password' => '', 
       //gestion_toto_users has 2 tables : users and db_users 
      'dbname' => 'gestion_toto_users', 
      'driverOptions' => array(1002 => 'SET NAMES utf8'), 
     ) 
    ), 
    'dynamic_orm' => array(
     'driverClass' =>'Doctrine\DBAL\Driver\PDOMySql\Driver', 
     'params' => array(
      'host'  => 'localhost', 
      'port'  => '3306', 
      'user'  => '', 
      'password' => '', 
      'dbname' => '', 
      'driverOptions' => array(1002 => 'SET NAMES utf8'), 
     ), 
    ), 
), 

'driver' => array(
    'orm_toto_users' => array(
     'class' => 'Doctrine\ORM\Mapping\Driver\DriverChain', 
     'drivers' => array(
      __NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver' 
     ) 
    ), 
    'dynamic_orm' => array(
     'drivers' => array(
      __NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver' 
     ) 
    ), 
), 

'entitymanager' => array(
    'orm_toto_users' => array(
     'connection' => 'orm_toto_users', 
     'configuration' => 'orm_default' 
    ), 
    'dynamic_orm' => array(
     'connection' => 'dynamic_orm', 
    ), 
), 

'eventmanager' => array(
    'orm_toto_users' => array() 
), 

'sql_logger_collector' => array(
    'orm_toto_users' => array(), 
), 

'entity_resolver' => array(
    'orm_toto_users' => array() 
),), 

module.config.php:

'doctrine' => array(
    'driver' => array(
     __NAMESPACE__ . '_driver' => array(
      'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver', 
      'cache' => 'array', 
      'paths' => array(
       __DIR__ . '/../src/' . __NAMESPACE__ . '/Entity' 
      ), 
     ), 
     'orm_default' => array(
      'drivers' => array(
       __NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver' 
      ) 
     ), 
    ), 
    'authentication' => array(
     'orm_default' => array(
      'object_manager' => 'doctrine.entitymanager.orm_toto_users', 
      'identity_class' => 'MyModule\Entity\User', 
      'identity_property' => 'identifiant', 
      'credential_property' => 'password', 
      'credential_callable' => function(\MyModule\Entity\User $user, $passwordGiven) { 
       $bcrypt = new \Zend\Crypt\Password\Bcrypt(); 
       return $bcrypt->verify($psswdGiven, $user->getPsswd()) && $user->getIsactif(); 
      }, 
     ), 
    ), 
), 

в Xcontroller:

public function getEntityManager() 
{ 
    if (null === $this->em) { 

     $this->em = $this->getServiceLocator()->get('dynamic_entity_manager'); 
    } 
    return $this->em; 
} 

в UserController:

public function getEntityManager() 
{ 
    if (null === $this->em) { 
     $this->em = $this->getServiceLocator()->get('doctrine.entitymanager.orm_toto_users'); 
    } 
    return $this->em; 
} 

в DynamicEMFactory.php:

class DynamicEMFactory implements FactoryInterface { 
public function createService(ServiceLocatorInterface $serviceLocator) 
{ 
     // Get current user 
    $authService = $serviceLocator->get('Zend\Authentication\AuthenticationService'); 
    if (! $authService->hasIdentity()) { 
     throw new \RuntimeException(
      'It is not possible to create a dynamic entity manager before a user has logged in' 
     ); 
    } 

    $user = $authService->getIdentity(); 
    $db_User = $user->getUser_db()->getDbuser(); 
    $db_Psswd = $user->getUser_db()->getDbpsswd(); 
    $db_Name = $user->getUser_db()->getDbname(); 

     // Update connection config 
    $globalConfig = $serviceLocator->get('config'); 
    $globalConfig['doctrine']['connection']['dynamic_orm']['params']['user'] = $db_User; 
    $globalConfig['doctrine']['connection']['dynamic_orm']['params']['password'] = $db_Psswd; 
    $globalConfig['doctrine']['connection']['dynamic_orm']['params']['dbname'] = $db_Name; 

    $isAllowOverride = $serviceLocator->getAllowOverride(); 
    $serviceLocator->setAllowOverride(true); 
    $serviceLocator->setService('config', $globalConfig); 
    $serviceLocator->setAllowOverride($isAllowOverride); 

    return $serviceLocator->get('doctrine.entitymanager.dynamic_orm'); 
} 

}

в module.config:

'service_manager' => array(
    'factories' => array(

     'dynamic_entity_manager' => 'XXX\Service\Factory\DynamicEMFactory', 

в onBootstrap (изменить): Внешность

$authService = $serviceManager->get('Zend\Authentication\AuthenticationService'); 
    if ($authService->getIdentity()) { 
     $em = $serviceManager->get('dynamic_entity_manager'); 
    } else { 
     $em = $serviceManager->get('doctrine.entitymanager.orm_default'); 
    } 
    $viewModel = $e->getApplication()->getMvcEvent()->getViewModel(); 
    $query = $serviceManager->get('param_user'); 
    $tab = $query->getReponse($em); 
    $nom_theme = $tab['something'])); 
    $viewModel->nom_theme = $nom_theme;//to layout