REST API vs GraphQL: Quale Scegliere nel 2024?
Un confronto approfondito tra REST e GraphQL per aiutarti a scegliere la soluzione giusta per il tuo...
Guida pratica allo sviluppo di applicazioni SaaS: multi-tenancy, billing, subscriptions e scalabilità.
Autore
Giovanni D'Ippolito
Pubblicato
17 December 2025
Tempo di lettura
3 minuti
Software as a Service (SaaS) è il modello di business più redditizio nel tech. Scopri come crearne uno con Laravel.
Un SaaS è un'applicazione web accessibile tramite subscription, dove ogni cliente ha il proprio spazio isolato (tenant).
<?php
// Tenancy Package
composer require spatie/laravel-multitenancy
// Tenant Model
class Tenant extends Model
{
protected $fillable = ['name', 'domain', 'database'];
public function users()
{
return $this->hasMany(User::class);
}
public function makeCurrent()
{
// Switch database connection
config([
'database.connections.tenant.database' => $this->database
]);
DB::purge('tenant');
DB::reconnect('tenant');
app()->instance('currentTenant', $this);
}
}
// Middleware
class SetTenant
{
public function handle($request, $next)
{
$domain = $request->getHost();
$tenant = Tenant::where('domain', $domain)->firstOrFail();
$tenant->makeCurrent();
return $next($request);
}
}
?>
<?php
// Laravel Cashier per Stripe
composer require laravel/cashier
// Subscription Model
class Subscription extends Model
{
public function isPlan(string $plan): bool
{
return $this->stripe_plan === $plan;
}
public function canAccessFeature(string $feature): bool
{
$features = config("plans.{$this->stripe_plan}.features");
return in_array($feature, $features);
}
}
// Subscription Controller
class SubscriptionController extends Controller
{
public function subscribe(Request $request, string $plan)
{
$user = auth()->user();
// Crea subscription con Stripe
$user->newSubscription('default', $plan)
->trialDays(14)
->create($request->payment_method);
return redirect()->route('dashboard')
->with('success', 'Subscription attivata!');
}
public function cancel()
{
auth()->user()->subscription('default')->cancel();
return back()->with('success', 'Subscription cancellata');
}
}
?>
<?php
// config/plans.php
return [
'starter' => [
'name' => 'Starter',
'price' => 9.99,
'features' => [
'projects' => 5,
'users' => 2,
'storage' => 1, // GB
'api_access' => false,
]
],
'professional' => [
'name' => 'Professional',
'price' => 29.99,
'features' => [
'projects' => 50,
'users' => 10,
'storage' => 10,
'api_access' => true,
]
],
'enterprise' => [
'name' => 'Enterprise',
'price' => 99.99,
'features' => [
'projects' => -1, // unlimited
'users' => -1,
'storage' => 100,
'api_access' => true,
'priority_support' => true,
]
]
];
// Usage Tracking
class UsageTracker
{
public static function canCreateProject(User $user): bool
{
$plan = $user->subscription->plan;
$limit = config("plans.{$plan}.features.projects");
if ($limit === -1) return true;
return $user->projects()->count() < $limit;
}
public static function recordStorageUsage(User $user, int $bytes)
{
$user->tenant->increment('storage_used', $bytes);
$limitGb = config("plans.{$user->subscription->plan}.features.storage");
$limitBytes = $limitGb * 1024 * 1024 * 1024;
if ($user->tenant->storage_used > $limitBytes) {
throw new StorageLimitExceededException();
}
}
}
?>
Un confronto approfondito tra REST e GraphQL per aiutarti a scegliere la soluzione giusta per il tuo...
Configura un ambiente di sviluppo Docker ottimizzato per progetti Laravel.
Le funzionalità JavaScript moderne che ogni sviluppatore PHP dovrebbe conoscere.
Iscriviti alla nostra newsletter per ricevere gli ultimi articoli e novità direttamente nella tua casella di posta.