1. Go to this page and download the library: Download crumbls/subscriptions library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
crumbls / subscriptions example snippets
use Crumbls\Subscriptions\Traits\HasPlanSubscriptions;
class Tenant extends Model
{
use HasPlanSubscriptions;
}
use Crumbls\Subscriptions\Models\Plan;
use Crumbls\Subscriptions\Models\Feature;
use Crumbls\Subscriptions\Models\PlanSubscription;
Plan::factory()->create(); // a generic paid plan
Plan::factory()->free()->create(); // price = 0
Plan::factory()->paid()->withTrial(14)->create(); // 14-day trial
Plan::factory()->withGrace(7)->create(); // 7-day grace window
Plan::factory()->limitedTo(100)->create(); // capped at 100 subscribers
Plan::factory()->inactive()->create(); // is_active = false
Feature::factory()->resettableMonthly()->create();
Feature::factory()->resettableDaily()->create();
PlanSubscription::factory()
->for($user, 'subscriber')
->ended()
->canceled()
->create();
$tenant->subscribe('main', $plan);
// Or the longer-named original:
$tenant->newPlanSubscription('main', $plan);
// Both take an optional start date:
$tenant->subscribe('main', $plan, now()->addDay());
$tenant->subscribedTo($plan->id); // bool
$tenant->hasActiveSubscription(); // any active sub?
$subscription = $tenant->planSubscription('main');
$subscription = $tenant->currentSubscription(); // most recent active
$subscription->active(); // true if not ended, or on trial/grace
$subscription->onTrial(); // currently in trial period
$subscription->onGracePeriod(); // ended but within grace window
$subscription->canceled(); // has been canceled
$subscription->ended(); // period has expired
$subscription->inactive(); // opposite of active
$subscription->pendingCancellation(); // canceled but not yet ended
$subscription->daysUntilEnd(); // int or null
$subscription->daysUntilTrialEnd(); // int or null
$subscription->recordFeatureUsage('api-requests');
$subscription->recordFeatureUsage('api-requests', 5); // add 5
$subscription->recordFeatureUsage('api-requests', 10, false); // set to 10
$subscription->reduceFeatureUsage('api-requests', 3);
$subscription->canUseFeature('api-requests'); // bool — checks used < value
$subscription->getFeatureUsage('api-requests'); // int — current usage
$subscription->getFeatureRemainings('api-requests'); // int — remaining quota
$subscription->getFeatureValue('api-requests'); // raw value from pivot
// When adding a user to a tenant
$subscription = $tenant->currentSubscription();
if (!$subscription->canUseFeature('users')) {
throw new \Exception('User limit reached for your plan.');
}
$subscription->recordFeatureUsage('users');
// When removing a user
$subscription->reduceFeatureUsage('users');
$subscription->changePlan($newPlan); // switch plans (resets usage if billing cycle changes)
$subscription->renew(); // start a new period
$subscription->cancel(); // cancel at end of current period
$subscription->cancel(immediately: true); // cancel now
$subscription->reactivate(); // undo pending cancellation
use Crumbls\Subscriptions\Models\PlanSubscription;
PlanSubscription::findActive()->get();
PlanSubscription::findEndingPeriod(7)->get(); // ending within 7 days
PlanSubscription::findEndedPeriod()->get();
PlanSubscription::findEndingTrial(3)->get(); // trial ending within 3 days
PlanSubscription::findEndedTrial()->get();
PlanSubscription::ofSubscriber($tenant)->get();
PlanSubscription::byPlanId($plan->id)->get();
Plan::active()->get();
Plan::inactive()->get();
Plan::free()->get();
Plan::paid()->get();
use Crumbls\Subscriptions\Events\SubscriptionCreated;
class SendWelcomeEmail
{
public function handle(SubscriptionCreated $event): void
{
$event->subscription->subscriber->notify(/* ... */);
}
}
// Must have the "api-requests" feature available
Route::middleware('can-use-feature:api-requests')->group(/* ... */);
// Check a specific subscription by slug
Route::middleware('can-use-feature:api-requests,pro')->group(/* ... */);
// Must have any active subscription
Route::middleware('subscribed')->group(/* ... */);
// Must be subscribed to a specific plan slug
Route::middleware('subscribed:pro')->group(/* ... */);
// routes/console.php or bootstrap/app.php
Schedule::command('subscriptions:prune --force')->daily();
namespace App\Models;
use Crumbls\Subscriptions\Models\Plan as BasePlan;
class Plan extends BasePlan
{
public function cancel(bool $immediately = false): static
{
// Cancel recurring payment with your provider
$this->subscriber->paymentProvider()->cancelSubscription($this);
return parent::cancel($immediately);
}
}