CakePHP3.2 api 之读写分离

   作为API的cake3.2,做项目时就需要把数据的读和写分离开,然后cakephp自带的两种获取配置的方法,简单介绍两种方法

  1.ConnectionManager::get('write*)

   这种方法是直接获取app.php里的配置

 'Datasources' => [
        'default' => [
            'className' => 'Cake\Database\Connection',
            'driver' => 'Cake\Database\Driver\Mysql',
            'persistent' => false,
            'host' => '',
                      //'port' => 'non_standard_port_number',
            'username' => '',
            'password' => '',
            'database' => '',
            'encoding' => 'utf8',
            'timezone' => 'UTC',
            'flags' => [],
            'cacheMetadata' => true,
            'log' => false
        ]
        ]
get()方法内写的是数据配置key

  2.TableRegistry::get('tg_*')

而对于这种方法是与model进行绑定,但是这样框架里默认获取的app.php中的defaule的默认配置,而做到模块化开发,又想读写分离就得改动框架内部的底层代码

1.程序路径

首先找到\vendor\cakephp\cakephp\src\ORM\Locator 下的TableLocator.php  LocatorInterface.php

2.修改源代码

LocatorInterface.php  中的get方法修改为

public function get($alias, array $options = []);
TableLocator.php  中的get方法修改为

public function get($alias, array $options = [],$config='')
    {
        if (isset($this->_instances[$alias])) {
            if (!empty($options) && $this->_options[$alias] !== $options) {
                throw new RuntimeException(sprintf(
                    'You cannot configure "%s", it already exists in the registry.',
                    $alias
                ));
            }
            return $this->_instances[$alias];
        }

        $this->_options[$alias] = $options;
        list(, $classAlias) = pluginSplit($alias);
        $options = ['alias' => $classAlias] + $options;

        if (isset($this->_config[$alias])) {
            $options += $this->_config[$alias];
        }

        if (empty($options['className'])) {
            $options['className'] = Inflector::camelize($alias);
        }

        $className = $this->_getClassName($alias, $options);
        if ($className) {
            $options['className'] = $className;
        } else {
            if (!isset($options['table']) && strpos($options['className'], '\\') === false) {
                list(, $table) = pluginSplit($options['className']);
                $options['table'] = Inflector::underscore($table);
            }
            $options['className'] = 'Cake\ORM\Table';
        }

        if (empty($options['connection'])) {
            $connectionName = $options['className']::defaultConnectionName();
			if(empty($config)){
				 $options['connection'] = ConnectionManager::get($connectionName);
			}else{
				$options['connection'] = ConnectionManager::get($config);
			}
           
        }

        $options['registryAlias'] = $alias;
        $this->_instances[$alias] = $this->_create($options);

        if ($options['className'] === 'Cake\ORM\Table') {
            $this->_fallbacked[$alias] = $this->_instances[$alias];
        }

        return $this->_instances[$alias];
    }
这样在调用 TableRegistry::get('tg_*','write')这样就可以获取写的配置了,如果不传第二个参数,就可以默认是default




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淋过雨的街头

你的鼓励是我创作的做大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值