Класс Zend Framework 3 Model вызывается для получения конфигурации базы данных - PullRequest
0 голосов
/ 29 мая 2018

У меня есть следующие классы моделей:

MasterModel:

namespace sf\ZfCommons\Model;

use Zend\Db\Sql\Sql;
use Zend\Db\Adapter\Adapter;

class MasterModel extends AbstractModel
{
    public $db;
    public $dbSys;
    public $dbUserClient;
    public $dbSysParams;
    public $dbUserClientParams;

    public function __construct()
    {
        $this->dbSys = new Adapter(Array(
            'driver' => 'Pdo_Mysql',
            'hostname' => 'localhost',
            'database' => 'db1',
            'username' => 'root',
            'password' => 'password',
            'charset' => 'utf8'
            ));

        $this->dbUserClient = new Adapter(Array(
            'driver' => 'Pdo_Mysql',
            'hostname' => 'localhost',
            'database' => 'db2',
            'username' => 'root',
            'password' => 'password',
            'charset' => 'utf8'
            ));

        if ($this::TBL_PLACE == 'user_client') {
            $this->db = $this->dbUserClient;
        } else {
            $this->db = $this->dbSys;
        }
        $this->sql = new Sql($this->db);
    }
}

AbstractModel:

namespace sf\ZfCommons\Model;

use Interop\Container\ContainerInterface;
use Zend\ServiceManager\ServiceManager;

class AbstractModel
{
    /**
     * @var ServiceManager
     */
    protected $serviceManager;

    /**
     * @return ServiceManager
     */
    public function getServiceManager()
    {
        return $this->serviceManager;
    }

    /**
     * @param mixed $serviceManager
     * @return $this
     */
    public function setServiceManager(ContainerInterface $serviceManager)
    {
        $this->serviceManager = $serviceManager;
        return $this;
    }
}

ModelFactory:

namespace sf\ZfCommons\Model;

use Interop\Container\ContainerInterface;
use Zend\ServiceManager\Factory\FactoryInterface;

class ModelFactory implements FactoryInterface
{
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
    {
        echo "############# ModelFactory #################";

        $service = (null === $options) ? new $requestedName : new $requestedName($options);

        return $service->setServiceManager($container);
    }
}

Mymodule.config.php имеет строки:

...
'service_manager' => [
        'factories' => [
            \sf\ZfCommons\Model\MasterModel::class => \sf\ZfCommons\Model\ModelFactory::class
        ],
        'invokables' => [
        ],
    ],
...

Но Фабрика не называется ... Что здесь не так?Я хочу прочитать параметры db1 и db2 из конфигурации и установить 2 адаптера (для каждого db по одному адаптеру)

Как я могу это сделать?Есть ли другой способ получить конфигурацию?

1 Ответ

0 голосов
/ 29 мая 2018

Для вызова вашей фабрики вам нужно использовать Service Manager, чтобы получить службу MasterModel там, где вам нужно ее использовать, например, на другой фабрике.Например:

class SomethingFactory implements FactoryInterface
{
   public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
   { 
     $masterModel = $container->get(\sf\ZfCommons\Model\MasterModel::class);
     // then do something with $masterModel, like inject it into something else
     return new Something($masterModel);
   }
}

Кроме того, ZF имеет встроенную фабрику абстрактных адаптеров БД, которая может создавать оба адаптера для вас без необходимости создания класса MasterModel и его фабрики.Это предполагает, что вы создаете приложение MVC.

В вашем config/autoload/local.php или config/autoload/global.php добавьте следующее:

'db' => [
    'adapters' => [
        'dbSys' => [
            'charset' => 'utf8',
            'database' => 'db1',
            'driver' => 'Pdo_Mysql',
            'username' => 'username',
            'password' => 'password',
            'hostname' => 'localhost',
        ],
        'dbClient' => [
            'charset' => 'utf8',
            'database' => 'db2',
            'driver' => 'Pdo_Mysql',
            'username' => 'username',
            'password' => 'password',
            'hostname' => 'localhost',
        ],
    ],
],

В вашем module.config.php (хотя это будетлучше указать это в config/autoload/global.php), вы можете добавить следующие строки:

...
'service_manager' => [
     'factories' => [
         'dbSys' => \Zend\Db\Adapter\AdapterAbstractServiceFactory::class,
         'dbClient' => \Zend\Db\Adapter\AdapterAbstractServiceFactory::class,
     ],
     'invokables' => [
     ],
 ],
...

Но вам все равно нужно в какой-то момент использовать Service Manager, чтобы получить адаптеры.Используя приведенный выше пример:

$dbSys = $container->get('dbSys);
$dbClient = $container->get('dbClient');

Надеюсь, это поможет.

...