dlimars / laravel-tenant-subdomain
Pacote para facilitar criação de rotas e troca de banco de dados baseado no subdominio da sua aplicação
Installs: 1 762
Dependents: 0
Suggesters: 0
Security: 0
Stars: 25
Watchers: 6
Forks: 8
Open Issues: 0
Requires
- illuminate/config: 5.*
- illuminate/routing: 5.*
README
Este pacote irá auxiliar na organização de clientes em subdomínios usando Laravel.
Instalação
Adicione no seu composer.json
"require": { //.. "dlimars/laravel-tenant-subdomain": "^1.0" },
ou execute em seu terminal
composer require dlimars/laravel-tenant-subdomain
adicione o provider e o facade em config/app.php
:
'providers' => [ // outros providers Dlimars\Tenant\Providers\TenantServiceProvider::class, ], 'aliases' => [ // outros aliases 'Tenant' => Dlimars\Tenant\Facades\Tenant::class, ]
adicione o middleware em app/Http/Kernel.php
protected $routeMiddleware = [ // outros middlewares 'tenant.database' => \Dlimars\Tenant\Middlewares\TenantDatabase::class ];
Após isso, abra seu console e execute: php artisan vendor:publish
, modifique o arquivo config/tenant.php
para sua necessidade, abra seu arquivo .env
e adicione:
APP_HOST=domain.com
TENANT_SUBDOMAIN_ARGUMENT=_account_
Uso
para gerar rotas de subdominio, utilize da seguinte forma:
// Tenant::getFullDomain() retorna algo como '{_account_}.domain.com' Route::group(['domain' => Tenant::getFullDomain()], function () { Route::get('subdomain-teste/{id}', ['as' => 'subdomain-teste', function($subdomain, $id){ return route('subdomain-teste', ['123']); }]); });
para gerar rotas para a aplicação principal (que não seja subdominio), utilize da seguinte forma
// Tenant::getDomain() retorna algo como 'domain.com' Route::group(['domain' => Tenant::getDomain()], function () { Route::get('domain-teste/{id}', ['as' => 'domain-teste', function($id){ return route('domain-teste', ['123']); }]); }); // isso impede que rotas do dominio possam ser acessadas através do subdominio
Carregando as configurações de banco de acordo com o subdominio
os arquivos de configurações de banco serão lidos por padrão, dentro da pasta config/tenant
, com o exemplo de conteudo:
return [ 'driver' => 'mysql', 'host' => 'host', 'database' => 'db_subdomain', 'username' => 'user_subdomain', 'password' => 'user_password', 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', 'strict' => false, ];
o arquivo é lido e adicionado como conexão padrão tenant
, isso é feito via Middleware, em todas as rotas que irão utilizar base de dados própria, use o middleware tenant.database
:
Route::group(['domain' => Tenant::getFullDomain(), 'middleware' => ['tenant.database']], function () { Route::get('domain-teste/{id}', ['as' => 'domain-teste', function($id){ return route('domain-teste', ['123']); }]); });
Supondo que o usuário acesse http://beltrano.domain.com
, a configuração a ser carregada deverá estar em /config/tenants/beltrano.php
(isso é configurável)
Criar configurações de banco
Para criar uma nova configuração de banco, use da seguinte forma:
$config = [ 'foo' => 'bar' ]; Tenant::makeDatabaseConfigFile('foo', $config);
isso irá gerar um arquivo dentro de config/tenants
com o nome de foo.php
(ou como/onde for definido na configuração), com o seguinte conteúdo
return [ 'foo' => 'bar' ];
Excluir configurações de banco
Para excluir um arquivo de configuração, apenas execute da seguinte maneira:
Tenant::dropDatabaseConfigFile('foo');