The SDK provides multi-tenant session isolation for SaaS applications connecting to multiple SAP B1 databases.
use SapB1\MultiTenant\TenantManager;
$tenantManager = app(TenantManager::class);
// Set current tenant
$tenantManager->setTenant('tenant-123');
// Execute in tenant context
$tenantManager->forTenant('tenant-456', function() {
return SapB1::get('Orders')->value();
});Implement custom tenant resolution:
use SapB1\Contracts\TenantResolverInterface;
class MyTenantResolver implements TenantResolverInterface
{
public function resolve(): ?string
{
return auth()->user()?->tenant_id;
}
public function getConfig(string $tenantId): ?array
{
return Tenant::find($tenantId)?->sap_config;
}
}
// Register resolver
$tenantManager->setResolver(new MyTenantResolver());Built-in resolver for database-stored tenant configs:
use SapB1\MultiTenant\DatabaseTenantResolver;
$resolver = new DatabaseTenantResolver(
table: 'tenants',
tenantColumn: 'id',
configColumn: 'sap_config'
);
$tenantManager->setResolver($resolver);Store tenant SAP configs in your tenants table:
// Migration
Schema::create('tenants', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->json('sap_config'); // Store SAP connection details
$table->timestamps();
});
// Tenant sap_config structure
[
'base_url' => 'https://tenant-sap-server:50000',
'company_db' => 'TENANT_COMPANY',
'username' => 'manager',
'password' => 'encrypted_password',
]Use TenantMiddleware for automatic header injection:
use SapB1\Middleware\TenantMiddleware;
SapB1Client::pushMiddleware(new TenantMiddleware($tenantManager));- Session Isolation: Each tenant gets separate sessions
- Config Encryption: Encrypt sensitive config values
- Connection Pooling: Consider per-tenant connection pools
- Logging: Include tenant ID in all logs for debugging