Multi-Tenancy no Laravel

Multi-Tenancy no Laravel

O Laravel é um framework PHP altamente popular usado para desenvolvimento de aplicações web. Ele oferece uma série de recursos e ferramentas para ajudar a criar aplicações de alta qualidade de forma rápida e eficiente. Em muitos casos, as aplicações Laravel precisam ser desenvolvidas com suporte a vários locatários ou “tenants”, onde cada tenancy tem seu próprio espaço isolado e separado dentro da aplicação. Neste artigo, vamos mostrar como colocar suporte a tenants em uma aplicação Laravel 9.

Passo 1: Configuração do Banco de Dados

A primeira coisa que precisamos fazer é configurar o banco de dados para suportar tenants. Para isso, precisamos criar uma tabela separada para armazenar informações sobre os tenants. Esta tabela conterá informações como o nome do tenant, a URL, o endereço de e-mail e outras informações relevantes.

Para criar esta tabela, você pode usar o seguinte comando:

php artisan make:migration create_tenants_table

Em seguida, você precisa editar o arquivo de migração criado para incluir as colunas necessárias para a tabela de tenants. Aqui está um exemplo de como o arquivo de migração poderia parecer:

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateTenantsTable extends Migration
{
    public function up()
    {
        Schema::create('tenants', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('domain')->unique();
            $table->string('email');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('tenants');
    }
}

Em seguida, execute o comando abaixo para aplicar as mudanças no banco de dados:

php artisan migrate

Passo 2: Criação de um Model de Tenant

Em seguida, precisamos criar um model Laravel para representar a tabela de tenants. Este model será usado para recuperar e armazenar informações sobre os tenants. Para criar o model, você pode usar o seguinte comando:

php artisan make:model Tenant

Em seguida, você pode editar o arquivo de model

para incluir as propriedades relevantes para a tabela de tenants. Aqui está um exemplo de como o arquivo de model poderia parecer:

namespace App;

use Illuminate\Database\Eloquent\Model;

class Tenant extends Model
{
    protected $fillable = [
        'name', 'domain', 'email'
    ];
}

Passo 3: Configuração de Multi-Tenancy

Agora precisamos configurar a aplicação Laravel para suportar tenants. Para fazer isso, precisamos criar um middleware que verifique o domínio da URL e selecione o tenant correto. Para criar o middleware, você pode usar o seguinte comando:

php artisan make:middleware TenantMiddleware

Em seguida, você pode editar o arquivo de middleware para incluir a lógica necessária para selecionar o tenant correto. Aqui está um exemplo de como o arquivo de middleware poderia parecer:

namespace App\Http\Middleware;

use App\Tenant;
use Closure;
use Illuminate\Support\Facades\Config;

class TenantMiddleware
{
    public function handle($request, Closure $next)
    {
        $tenant = Tenant::where('domain', $request->getHost())->first();

        if ($tenant) {
            Config::set('database.connections.tenant.database', $tenant->name);
        }

        return $next($request);
    }
}

Em seguida, precisamos registrar o middleware na aplicação. Para fazer isso, você pode adicionar o seguinte código no arquivo app/Http/Kernel.php:

protected $middlewareGroups = [
    'web' => [
        // ...
        \App\Http\Middleware\TenantMiddleware::class,
    ],
];

Passo 4: Configuração do Banco de Dados por Tenant

Por fim, precisamos configurar o Laravel para usar a conexão correta com o banco de dados para cada tenant. Para fazer isso, você pode adicionar a seguinte seção no arquivo de configuração config/database.php:

'connections' => [
    // ...
    'tenant' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => null,
        'username' => env('DB_USERNAME', 'root'),
        'password' => env('DB_PASSWORD', ''),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'strict' => true,
        'engine' => null,
    ],
    // ...
],

Em resumo, o processo para colocar tenant de domínio em uma aplicação desenvolvida no framework Laravel 9 envolve criar um modelo de tenant, um middleware para selecionar o tenant correto, configurar a aplicação para suportar multi-tenancy e configurar o Laravel para usar a conexão correta com o banco de dados para cada tenant. Com estas etapas, você pode facilmente adicionar suporte multi-tenancy a sua aplicação Laravel.

Lembre-se de sempre testar a aplicação após fazer alterações para garantir que ela esteja funcionando corretamente. Além disso, é importante ter em mente que este é apenas um exemplo de como você pode implementar multi-tenancy em sua aplicação Laravel. É possível que você precise fazer algumas modificações para atender às suas necessidades específicas.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *