The Multi Tenant plugin allows an application to be separated in several applications having own routes, sharing the same code and different databases (or the same)., (*1)
Via composer:, (*2)
composer require waldemarnt/cake-multi-tenant
Or just download the repository here, (*3)
Just call the plugin below the Dispatch configuration in your boostrap, enable routes and boostrap., (*4)
CakePlugin::load('CakeMultiTenant', array('routes' => true, 'bootstrap' => true));
In the core file you will need add the several properties. Current tenant (or default)., (*5)
Configure::write('Config.current_tenant', 'example');
Note: current tenant will be the active tenant, you can use this information to know which tenant is active., (*6)
Tenant configuration will be an array using the tenant name as a index and connection_name will be the name of database connection that the tenant will use., (*7)
Configure::write('Config.multi_tenant_config', [ 'example' => [ 'name' => 'Example Tenant', 'connection_name' => 'my_custom_db_connection' ], 'waldemar' => [ 'name' => 'Waldemar', 'connection_name' => 'my_other_db_connection' ] ] );
In the database file you just need add the configuration for each tenant like this:, (*8)
public $my_custom_db_connection = array( 'datasource' => 'Database/Mysql', 'persistent' => false, 'host' => '172.17.0.3', 'login' => 'root', 'password' => 'root', 'database' => 'db_one', 'prefix' => '', //'encoding' => 'utf8', ); public $my_other_db_connection = array( 'datasource' => 'Database/Mysql', 'persistent' => false, 'host' => '172.17.0.3', 'login' => 'root', 'password' => 'root', 'database' => 'db_two', 'prefix' => '', //'encoding' => 'utf8', );
Just extend your AppModel from MultiTenantAppModel, the MultiTenantAppModel that handles the database switch when the model will be created., (*9)
App::uses('MultiTenantAppModel', 'CakeMultiTenant.Model'); class AppModel extends MultiTenantAppModel { }
In the AppController you will need configure two stuffs, Html Helper and AuthComponent (if you need auth :D). Html helper configuration:, (*10)
public $helpers = array( 'Html' => array('className' => 'CakeMultiTenant.MultiTenantHtml'), );
AuthComponent configuration:, (*11)
public $components = array( 'Auth' => [ 'className' => 'CakeMultiTenant.MultiTenantAuth' );
Note: you can add loginAction and LoginRedirect configurations in the Auth component there's no change in the original behavior of the component., (*12)
0.*, (*13)