A package provide pricing plans for Laravel.
andychukse/laravel-pricing-plans is a Laravel package for a package provide pricing plans for laravel..
It currently has 11 GitHub stars and 2.664 downloads on Packagist (latest version v0.8.0).
Install it with composer require andychukse/laravel-pricing-plans.
Discover more Laravel packages by andychukse
or browse all Laravel packages to compare alternatives.
Last updated
Easy provide pricing plans for Your Laravel 7|8|9|10|11|12 Application.
Easy provide pricing plans for Your Laravel Application.
Begin by pulling in the package through Composer.
$ composer require andychukse/laravel-pricing-plans
Next, if using Laravel 5.5+, you are done.
If using Laravel 5.4, you must include the service provider within your config/app.php file.
// config/app.php
'providers' => [
// Other service providers...
Laravel\PricingPlans\PricingPlansServiceProvider::class,
],
Publish package config file and migrations with the command:
$ php artisan vendor:publish --provider="Laravel\PricingPlans\PricingPlansServiceProvider"
Then run migrations:
$ php artisan migrate
Add Laravel\PricingPlans\Contacts\Subscriber contract and Laravel\PricingPlans\Models\Concerns\Subscribable trait
to your subscriber model (Eg. User).
See the following example:
<?php
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Laravel\PricingPlans\Contracts\Subscriber;
use Laravel\PricingPlans\Models\Concerns\Subscribable;
class User extends Authenticatable implements Subscriber
{
use Subscribable;
// ...
}
You can configure what database tables, what models to use, list of positive words will use.
Definitions:
listing_title_bold
has the value Y (Y is one of the positive words) then, that means it's enabled.Take a look to the config/plans.php config file for more details.
PricingPlans uses 5 models under namespace Laravel\PricingPlans\Models. You can change to using extended classes of it by
changing models class in config file:
This model is model object of feature
<?php
namespace App\Models;
use Laravel\PricingPlans\Models\Feature as Model;
class Feature extends Model
{
const FEATURE_UPLOAD_IMAGES = 'upload-images';
const FEATURE_UPLOAD_VIDEO = 'upload-video';
}
This model is model object of plan
<?php
namespace App\Models;
use Laravel\PricingPlans\Models\Plan as Model;
class Plan extends Model
{
const PLAN_FREE = 'free';
const PLAN_PRO = 'pro';
}
This model is relation model object between plan and feature
This model is relation model object between plan and subscriber
This model is object for counting usage feature
For more details take a look to each model and the Laravel\PricingPlans\Models\Concerns\Subscribable trait.
Events are under the namespace Laravel\PricingPlans\Events. The following are the events triggered by the package.
SubscriptionRenewed eventFired when a subscription is renewed using the renew() method.
SubscriptionCanceled eventFired when a subscription is canceled using the cancel() method.
SubscriptionPlanChanged eventFired when a subscription's plan is changed. This will be triggered once the PlanSubscription model is saved.
Plan change is determine by comparing the original and current value of plan_id.
<?php
use Laravel\PricingPlans\Models\Feature;
use Laravel\PricingPlans\Models\Plan;
$feature1 = Feature::create([
'name' => 'Upload images',
'code' => 'upload-images',
'description' => null,
'interval_unit' => 'day',
'interval_count' => 1,
'sort_order' => 1,
]);
$feature2 = Feature::create([
'name' => 'upload video',
'code' => 'upload-video',
'description' => null,
'interval_unit' => 'day',
'interval_count' => 1,
'sort_order' => 2,
]);
$plan = Plan::create([
'name' => 'Pro',
'code' => 'pro',
'description' => 'Pro plan',
'price' => 9.99,
'interval_unit' => 'month',
'interval_count' => 1,
'trial_period_days' => 5,
'sort_order' => 1,
]);
$plan->features()->attach([
$feature1->id => ['value' => 5, 'note' => 'Can upload maximum 5 images daily'],
$feature2->id => ['value' => 1, 'note' => 'Can upload maximum 1 video daily'],
]);
You can subscribe a user to a plan by using the newSubscription() function available in the Subscribable trait.
First, retrieve an instance of your subscriber model, which typically will be your user model and an instance of the plan
your user is subscribing to. Once you have retrieved the model instance, you may use the newSubscription method
to create the model's subscription.
<?php
use Illuminate\Support\Facades\Auth;
use Laravel\PricingPlans\Models\Plan;
$user = Auth::user();
$plan = Plan::code(Plan::PLAN_PRO)->firstOrFail();
$user->newSubscription('main', $plan)->create();
The first argument passed to newSubscription method should be the name of the subscription. If your application offer
a single subscription, you might call this main or primary. The second argument is the plan instance your user is subscribing to.
There's multiple ways to determine the usage and ability of a particular feature in the user subscription, the most common one is canUse:
The canUse method returns true or false depending on multiple factors:
0.$user->subscription('main')->ability()->canUse(Feature::FEATURE_UPLOAD_IMAGES);
Other methods are:
enabled: returns true when the value of the feature is a positive word listed in the config file.consumed: returns how many times the user has used a particular feature.remainings: returns available uses for a particular feature.value: returns the feature value.All methods share the same signature: e.g.
$user->subscription('main')->ability()->consumed(Feature::FEATURE_UPLOAD_IMAGES);.
In order to efectively use the ability methods you will need to keep track of every usage of each feature
(or at least those that require it). You may use the record method available through the user subscriptionUsage()
method:
$user->subscriptionUsage('main')->record(Feature::FEATURE_UPLOAD_IMAGES);
The record method accept 3 parameters: the first one is the feature's code, the second one is the quantity of
uses to add (default is 1), and the third one indicates if the addition should be incremental (default behavior),
when disabled the usage will be override by the quantity provided. E.g.:
// Increment by 2
$user->subscriptionUsage('main')->record(Feature::FEATURE_UPLOAD_IMAGES, 2);
// Override with 9
$user->subscriptionUsage('main')->record(Feature::FEATURE_UPLOAD_IMAGES, 9, false);
Reducing the feature usage is almost the same as incrementing it. Here we only substract a given quantity (default is 1)
to the actual usage:
$user->subscriptionUsage('main')->reduce(Feature::FEATURE_UPLOAD_IMAGES, 2);
$user->subscriptionUsage('main')->clear();
For a subscription to be considered active one of the following must be true:
ends_at is in the future.$user->subscribed('main');
$user->subscribed('main', $planId); // Check if user is using a particular plan
Alternatively you can use the following methods available in the subscription model:
$user->subscription('main')->isActive();
$user->subscription('main')->isCanceled();
$user->subscription('main')->isCanceledImmediately();
$user->subscription('main')->isEnded();
$user->subscription('main')->onTrial();
Canceled subscriptions with an active trial or
ends_atin the future are considered active.
To renew a subscription you may use the renew method available in the subscription model.
This will set a new ends_at date based on the selected plan and will clear the usage data of the subscription.
$user->subscription('main')->renew();
Canceled subscriptions with an ended period can't be renewed.
To cancel a subscription, simply use the cancel method on the user's subscription:
$user->subscription('main')->cancel();
By default the subscription will remain active until the end of the period, you may pass true to end the subscription immediately:
$user->subscription('main')->cancel(true);
<?php
use Laravel\PricingPlans\Models\PlanSubscription;
// Get subscriptions by plan:
$subscriptions = PlanSubscription::byPlan($plan_id)->get();
// Get subscription by subscriber:
$subscription = PlanSubscription::bySubscriber($user)->first();
// Get subscriptions with trial ending in 3 days:
$subscriptions = PlanSubscription::findEndingTrial(3)->get();
// Get subscriptions with ended trial:
$subscriptions = PlanSubscription::findEndedTrial()->get();
// Get subscriptions with period ending in 3 days:
$subscriptions = PlanSubscription::findEndingPeriod(3)->get();
// Get subscriptions with ended period:
$subscriptions = PlanSubscription::findEndedPeriod()->get();
See all change logs in CHANGELOG
$ git clone [email protected]/andychukse/laravel-pricing-plans.git /path
$ cd /path
$ composer install
$ composer phpunit
Please see CONTRIBUTING for details.
If you discover any security related issues, please email to Andrew Eze instead of using the issue tracker.
I forked and updated this project to support laravel 8/9/10/11/12 from oanhnn/laravel-pricing-plans project.
This project is released under the MIT License.