The package doesn't add support for Laravel (yet). To install the package please follow the steps below.
open the config/services.php file and add the following to the list of services:
'teamleader' => [
'client_id' => env('TEAMLEADER_CLIENT_ID'),
'client_secret' => env('TEAMLEADER_CLIENT_SECRET'),
'redirect_uri' => env('TEAMLEADER_REDIRECT_URI'),
'state' => env('TEAMLEADER_STATE', 'FtvPC1SE2h3LVPEJZIsrfaVWTwwn7T0R'),
],Note: the state parameter. This can be whatever you want. We send the value to Teamleader, and Teamleader sends the same value back to us. If they don't match, someone tampered with the callback url.
Make sure those env values exist in your .env file
TEAMLEADER_CLIENT_ID=abc
TEAMLEADER_CLIENT_SECRET=abc
TEAMLEADER_REDIRECT_URI=https://yourapplication.com/teamleader/accept
open up your console and type the following command:
php artisan make:provider TeamleaderServiceProviderThis is the content of that file:
<?php
namespace App\Providers;
use Exception;
use Illuminate\Support\ServiceProvider;
use Illuminate\Contracts\Support\DeferrableProvider;
use Illuminate\Support\Facades\Storage;
use Justijndepover\Teamleader\Teamleader;
class TeamleaderServiceProvider extends ServiceProvider implements DeferrableProvider
{
public function register()
{
$this->app->singleton(Teamleader::class, function ($app) {
$teamleader = new Teamleader(
config('services.teamleader.client_id'),
config('services.teamleader.client_secret'),
config('services.teamleader.redirect_uri'),
config('services.teamleader.state'),
);
if (Storage::exists('teamleader.json') && $json = Storage::get('teamleader.json')) {
try {
$json = json_decode($json);
$teamleader->setAccessToken($json->accessToken);
$teamleader->setRefreshToken($json->refreshToken);
$teamleader->setTokenExpiresAt($json->expiresAt);
} catch (Exception $e) {
}
}
if (! empty($teamleader->getRefreshToken()) && $teamleader->shouldRefreshToken()) {
$teamleader->connect();
Storage::disk('local')->put('teamleader.json', json_encode([
'accessToken' => $teamleader->getAccessToken(),
'refreshToken' => $teamleader->getRefreshToken(),
'expiresAt' => $teamleader->getTokenExpiresAt(),
]));
}
return $teamleader;
});
}
public function provides()
{
return [Teamleader::class];
}
}Add the following 3 routes to your routes/web.php file
Route::get('teamleader', [SettingsController::class, 'index'])->name('settings.index');
Route::post('teamleader/authorize', [SettingsController::class, 'redirectForAuthorization'])->name('settings.teamleader.authorize');
Route::get('teamleader/accept', [SettingsController::class, 'accept']);Note: the teamleader/accept route should always be accessible. Don't put it behind auth middleware. This route is called by Teamleader.
Next, create the controller that handles the routes:
php artisan make:controller SettingsControllerThis is the content of that file
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Justijndepover\Teamleader\Teamleader;
class SettingsController extends Controller
{
public function index(Teamleader $teamleader)
{
// this view should show a 'connect to Teamleader' button
// or when logged in, show a message: 'You are logged in'
return view('settings.index', [
'teamleader' => $teamleader,
]);
}
public function redirectForAuthorization(Teamleader $teamleader)
{
return redirect($teamleader->redirectForAuthorizationUrl());
}
public function accept(Request $request, Teamleader $teamleader)
{
if ($request->error) {
return redirect()->route('settings.index')->with('error', __('The user refused to connect'));
}
if ($request->state != $teamleader->getState()) {
return redirect()->route('settings.index')->with('error', __('The state parameter doesn\'t match.'));
}
$teamleader->setAuthorizationCode($request->code);
$teamleader->connect();
Storage::disk('local')->put('teamleader.json', json_encode([
'accessToken' => $teamleader->getAccessToken(),
'refreshToken' => $teamleader->getRefreshToken(),
'expiresAt' => $teamleader->getTokenExpiresAt(),
]));
return redirect()->route('settings.index')->with('message', __('You are connected with Teamleader'));
}
}The code above assumes you have a settings.index view. This could be the content of that file:
@if (session()->has('message'))
{{ session()->get('message') }}
@endif
@if (session()->has('error'))
{{ session()->get('error') }}
@endif
@if ($teamleader->shouldAuthorize())
<form action="{{ route('settings.teamleader.authorize') }}" method="POST">
@csrf
<button type="submit">{{ __('default.teamleader.connect') }}</button>
</form>
@else
<p>You are already connected with Teamleader</p>
@endif