您的位置:首页 > 编程语言 > PHP开发

CakePHP3.2 api 之读写分离

2016-06-21 11:52 513 查看
   作为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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cakephp php api 框架 class