multiplier/laravel-tenant-subdomain

Pacote para facilitar criação de rotas e troca de banco de dados baseado no subdominio da sua aplicação

v1.0.8 2020-04-14 14:28 UTC

This package is auto-updated.

Last update: 2024-04-14 23:34:52 UTC


README

Este pacote irá auxiliar na organização de clientes em subdomínios usando Laravel.

Instalação

Execute em seu terminal

    composer require multiplier/laravel-tenant-subdomain

adicione o provider e o facade em config/app.php:

'providers' => [
    // outros providers
    Multiplier\Tenant\Providers\TenantServiceProvider::class,
],

'aliases' => [
    // outros aliases
    'Tenant' => Multiplier\Tenant\Facades\Tenant::class,
]

adicione o middleware em app/Http/Kernel.php

protected $routeMiddleware = [
    // outros middlewares
    'tenant.database' => \Multiplier\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');