Package Data | |
---|---|
Maintainer Username: | spatie |
Maintainer Contact: | rias@spatie.be (Rias Van der Veken) |
Package Create Date: | 2022-06-16 |
Package Last Update: | 2024-09-23 |
Home Page: | https://rias.be/blog/laravel-package-to-onboard-your-users |
Language: | PHP |
License: | MIT |
Last Refreshed: | 2024-11-18 03:00:40 |
Package Statistics | |
---|---|
Total Downloads: | 151,951 |
Monthly Downloads: | 7,229 |
Daily Downloads: | 81 |
Total Stars: | 627 |
Total Watchers: | 9 |
Total Forks: | 26 |
Total Open Issues: | 0 |
This package lets you set up an onboarding flow for your application's users.
Here's an example of how it's set up:
use App\User;
use Spatie\Onboard\Facades\Onboard;
Onboard::addStep('Complete Profile')
->link('/profile')
->cta('Complete')
->completeIf(function (User $user) {
return $user->profile->isComplete();
});
Onboard::addStep('Create Your First Post')
->link('/post/create')
->cta('Create Post')
->completeIf(function (User $user) {
return $user->posts->count() > 0;
});
You can then render this onboarding flow however you want in your templates:
@if (auth()->user()->onboarding()->inProgress())
<div>
@foreach (auth()->user()->onboarding()->steps as $step)
<span>
@if($step->complete())
<i class="fa fa-check-square-o fa-fw"></i>
<s>{{ $loop->iteration }}. {{ $step->title }}</s>
@else
<i class="fa fa-square-o fa-fw"></i>
{{ $loop->iteration }}. {{ $step->title }}
@endif
</span>
<a href="{{ $step->link }}" {{ $step->complete() ? 'disabled' : '' }}>
{{ $step->cta }}
</a>
@endforeach
</div>
@endif
We invest a lot of resources into creating best in class open source packages. You can support us by buying one of our paid products.
We highly appreciate you sending us a postcard from your hometown, mentioning which of our package(s) you are using. You'll find our address on our contact page. We publish all received postcards on our virtual postcard wall.
You can install the package via composer:
composer require spatie/laravel-onboard
Add the Spatie\Onboard\Concerns\GetsOnboarded
trait and Spatie\Onboard\Concerns\Onboardable
interface to any model or class in your app, for example the User
model:
class User extends Model implements \Spatie\Onboard\Concerns\Onboardable
{
use \Spatie\Onboard\Concerns\GetsOnboarded;
...
Configure your steps in your App\Providers\AppServiceProvider.php
use App\User;
use Spatie\Onboard\Facades\Onboard;
class AppServiceProvider extends ServiceProvider
{
// ...
public function boot()
{
Onboard::addStep('Complete Profile')
->link('/profile')
->cta('Complete')
/**
* The completeIf will pass the class that you've added the
* interface & trait to. You can use Laravel's dependency
* injection here to inject anything else as well.
*/
->completeIf(function (User $model) {
return $model->profile->isComplete();
});
Onboard::addStep('Create Your First Post')
->link('/post/create')
->cta('Create Post')
->completeIf(function (User $model) {
return $model->posts->count() > 0;
});
The variable name passed to the completeIf
callback must be $model
.
Now you can access these steps along with their state wherever you like. Here is an example blade template:
@if (auth()->user()->onboarding()->inProgress())
<div>
@foreach (auth()->user()->onboarding()->steps as $step)
<span>
@if($step->complete())
<i class="fa fa-check-square-o fa-fw"></i>
<s>{{ $loop->iteration }}. {{ $step->title }}</s>
@else
<i class="fa fa-square-o fa-fw"></i>
{{ $loop->iteration }}. {{ $step->title }}
@endif
</span>
<a href="{{ $step->link }}" {{ $step->complete() ? 'disabled' : '' }}>
{{ $step->cta }}
</a>
@endforeach
</div>
@endif
Check out all the available features below:
/** @var \Spatie\Onboard\OnboardingManager $onboarding **/
$onboarding = Auth::user()->onboarding();
$onboarding->inProgress();
$onboarding->percentageCompleted();
$onboarding->finished();
$onboarding->steps()->each(function($step) {
$step->title;
$step->cta;
$step->link;
$step->complete();
$step->incomplete();
});
Excluding steps based on condition:
Onboard::addStep('Excluded Step')
->excludeIf(function (User $model) {
return $model->isAdmin();
});
Definining custom attributes and accessing them:
// Defining the attributes
Onboard::addStep('Step w/ custom attributes')
->attributes([
'name' => 'Waldo',
'shirt_color' => 'Red & White',
]);
// Accessing them
$step->name;
$step->shirt_color;
If you want to ensure that your User is redirected to the next unfinished onboarding step, whenever they access your web application, you can use the following middleware as a starting point:
<?php
namespace App\Http\Middleware;
use Auth;
use Closure;
class RedirectToUnfinishedOnboardingStep
{
public function handle($request, Closure $next)
{
if (auth()->user()->onboarding()->inProgress()) {
return redirect()->to(
auth()->user()->onboarding()->nextUnfinishedStep()->link
);
}
return $next($request);
}
}
Quick tip: Don't add this middleware to routes that update the state of the onboarding steps, your users will not be able to progress because they will be redirected back to the onboarding step.
composer test
Please see CHANGELOG for more information on what has changed recently.
Please see CONTRIBUTING for details.
Please review our security policy on how to report security vulnerabilities.
The original code from this package came from Onboard by Caleb Porzio, who was gratious enough to let us continue development.
The MIT License (MIT). Please see License File for more information.