flitty / subscription
Simple subscription wrap
Installs: 2
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 0
Open Issues: 0
pkg:composer/flitty/subscription
Requires
- php: >=7.1
- laravel/framework: >=5.4
- srmklive/paypal: ~1.0
Requires (Dev)
- mockery/mockery: ~1.0
- phpunit/phpunit: ~6.0
This package is auto-updated.
Last update: 2025-10-28 07:29:42 UTC
README
Installation
1. Require package in your progect
composer require flitty/subscription
2. Register package service provider in your app (app.providers)
Flitty\Subscription\Providers\SubscriptionServiceProvider::class
3. Puplish migrations and the package config file
php artisan vendor:publish --provider=SubscriptionServiceProvider
4. Create tables
php artisan migrate
5. Configure callback link in config file. Default value is:
'express-checkout-success' => '/subscription/express-checkout-success?driver=pay-pal-subscription',
5. Add Your subscription types into `subscription_types` table
6. Set up subscriber entity
Register Subscriber trait and contract into Users Model
use Flitty\Subscription\Traits\Subscriber;
implement Flitty\Subscription\Contracts\SubscriberContract
7. Set up subscription entity
Register Subscription entity trait and contract into subscription entity Model
use Flitty\Subscription\Traits\Subscribable;
implement Flitty\Subscription\Contracts\SubscribableEntityContract
Subscription entity should has `subscription_type_id` (you can change field name in config 'subscription.type.foreign')
8. You can add coupones in `subscription_coupons` table
9. Register middlewares. Update your 'app/Http/Kernel.php' class. Add the following line to $routeMiddleware
'subscribed' => HasSubscriptionMiddleware::class,
Usage
In controller
Your controller should has at less 3 methods
public function expressCheckout(ExpressCheckoutRequest $request)
{
try {
$response = Auth::user()->subscribeEntity(
$request->get('subscriptionTypeId'),
$request->get('coupon'),
$request->get('driver')
);
} catch (UserAlreadyHasTheSubscription $e) {
Session::flash('error', $e->getMessage());
$response = redirect()->route('subscription-route-name');
} catch (SubscriptionRedirectHasBeenFailedException $e) {
Session::flash('error', $e->getMessage());
$response = redirect()->route('subscription-route-name');
}
return $response;
}
public function expressCheckoutSuccess(Request $request)
{
try {
app($request->get('driver'))->subscriptionCallback($request->get('token'));
Session::flash('notice', Message::getMessageData(Message::SUBSCRIBED_SUCCESSFULLY));
} catch (SubscriptionCallbackHasBeenFailedException $e) {
Session::flash('error', $e->getMessage());
}
return redirect()->route('subscription-route-name');
}
public function payPalCallback(Request $request)
{
$requestData = $request->all();
try {
app(SubscriptionServiceProvider::PAY_PAL_DRIVER)->cmdCallback($requestData);
$message = 'User has been updated his subscription';
} catch (SubscriptionHasNotBeenFoundException $e) {
$message = $e->getMessage();
} catch (InvalidResponseException $e) {
$message = $e->getMessage();
}
logger()->info($message, $requestData);
return response()->json(['message' => $message]);
}
Optional methods:
public function cancelSubscription(CancelSubscriptionRequest $request)
{
$type = 'error';
try {
Auth::user()->cancelSubscription($request->get('subscriptionTypeId'), $request->get('driver'));
$message = 'User has been canceled subscription successfully';
$type = 'notice';
} catch (UserHasNoSubscriptionException $e) {
$message = $e->getMessage();
} catch (CancelSubscriptionHasBeenFailed $e) {
$message = $e->getMessage();
}
Session::flash($type, $message);
return redirect()->route('settings');
}
public function suspendSubscription(SuspendSubscriptionRequest $request)
{
$type = 'error';
try {
Auth::user()->suspendSubscription($request->get('subscriptionTypeId'), $request->get('driver'));
$message = 'User has been suspended subscription successfully';
$type = 'notice';
} catch (UserHasNoSubscriptionException $e) {
$message = $e->getMessage();
} catch (CancelSubscriptionHasBeenFailed $e) {
$message = $e->getMessage();
}
Session::flash($type, $message);
return redirect()->route('settings');
}
public function reactivateSubscription(ReactivateSubscriptionRequest $request)
{
$type = 'error';
try {
Auth::user()->reactivateSubscription($request->get('subscriptionTypeId'), $request->get('driver'));
$message = 'User has been reactivated subscription successfully';
$type = 'notice';
} catch (UserHasNoSubscriptionException $e) {
$message = $e->getMessage();
} catch (CancelSubscriptionHasBeenFailed $e) {
$message = $e->getMessage();
}
Session::flash($type, $message);
return redirect()->route('settings');
}
Get subscription entities
Get all entities of authentificated user
$subscriber = Auth::user();
$entities = Entity::subscribable($subscriber)->get();
Middleware&Routing
You can limit the access to routes by using middlewares
Route::get('subscription-entities', 'EntityController@index')->middleware('subscribed:{id of the subscription type}');
Get Subscriber subscriptions
Get authentificated user subscription type
$subscriber = Auth::user();
$subscriber->getTypeSubscription($subscriptionTypeId);
Get all authentificated user subscriptions
$subscriber = Auth::user();
$subscriber->getSubscriptions();