PHPackages                             jjuanrivvera/canvas-lms-kit-laravel - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. jjuanrivvera/canvas-lms-kit-laravel

ActiveLibrary[API Development](/categories/api)

jjuanrivvera/canvas-lms-kit-laravel
===================================

Laravel integration for Canvas LMS Kit - Auto-configuration, multi-tenancy, and testing utilities

v0.2.1(8mo ago)13MITPHPPHP ^8.1

Since Sep 5Pushed 8mo agoCompare

[ Source](https://github.com/jjuanrivvera/canvas-lms-kit-laravel)[ Packagist](https://packagist.org/packages/jjuanrivvera/canvas-lms-kit-laravel)[ Docs](https://github.com/jjuanrivvera/canvas-lms-kit-laravel)[ RSS](/packages/jjuanrivvera-canvas-lms-kit-laravel/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (4)Dependencies (13)Versions (6)Used By (0)

Canvas LMS Kit for Laravel
==========================

[](#canvas-lms-kit-for-laravel)

[![Latest Version on Packagist](https://camo.githubusercontent.com/06bffdf85ed149f81627926b09d4808a33f3b9d1ec32c8ee309334a643b4f41a/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f6a6a75616e726976766572612f63616e7661732d6c6d732d6b69742d6c61726176656c2e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/jjuanrivvera/canvas-lms-kit-laravel)[![Total Downloads](https://camo.githubusercontent.com/237af58a040f142b2d1c1c28b069eaa57595bb39a56df79f8b41706ad6c56bfc/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f6a6a75616e726976766572612f63616e7661732d6c6d732d6b69742d6c61726176656c2e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/jjuanrivvera/canvas-lms-kit-laravel)[![Tests](https://camo.githubusercontent.com/35ecd29b82339cbe7803a3bee7206f5c87c917a773f10cbd109775affa221b22/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f6a6a75616e726976766572612f63616e7661732d6c6d732d6b69742d6c61726176656c2f72756e2d74657374732e796d6c3f6272616e63683d6d61696e266c6162656c3d7465737473)](https://github.com/jjuanrivvera/canvas-lms-kit-laravel/actions)

A minimal Laravel integration package for the [Canvas LMS Kit](https://github.com/jjuanrivvera/canvas-lms-kit). Auto-configure Canvas API access, manage multiple connections, and test with ease.

✨ Features
----------

[](#-features)

- 🚀 **Zero Configuration** - Works immediately after installation
- 🔄 **Multi-Tenant Support** - Easily switch between Canvas instances
- 🧪 **Testing Utilities** - Mock Canvas API calls in your tests
- 📦 **Minimal &amp; Focused** - Just 500 lines of code that do exactly what you need
- 🔧 **Laravel Native** - Uses Laravel's config, logging, and testing systems

📦 Installation
--------------

[](#-installation)

```
composer require jjuanrivvera/canvas-lms-kit-laravel
```

⚡ Quick Start
-------------

[](#-quick-start)

### 1. Publish Configuration

[](#1-publish-configuration)

```
php artisan vendor:publish --tag=canvas-config
```

### 2. Add Credentials to `.env`

[](#2-add-credentials-to-env)

```
CANVAS_API_KEY=your-api-key-here
CANVAS_BASE_URL=https://your-institution.instructure.com
CANVAS_ACCOUNT_ID=1
```

### 3. Test Your Connection

[](#3-test-your-connection)

```
php artisan canvas:test
```

### 4. Start Using!

[](#4-start-using)

```
use CanvasLMS\Api\Courses\Course;
use CanvasLMS\Api\Users\User;

// That's it! The package auto-configures everything
$courses = Course::get();
$user = User::find(123);
```

🎯 Why This Package?
-------------------

[](#-why-this-package)

### The Problem

[](#the-problem)

Without this package, you need to manually configure Canvas LMS Kit in every controller, job, or service:

```
// 😫 Before - Manual configuration everywhere
class CourseController
{
    public function __construct()
    {
        Config::setApiKey(env('CANVAS_API_KEY'));
        Config::setBaseUrl(env('CANVAS_BASE_URL'));
        Config::setAccountId(env('CANVAS_ACCOUNT_ID'));
        // ... more configuration
    }
}
```

### The Solution

[](#the-solution)

This package auto-configures everything from your Laravel config:

```
// 😊 After - Just works!
class CourseController
{
    public function index()
    {
        return Course::get(); // Already configured!
    }
}
```

📖 Usage
-------

[](#-usage)

### Basic Usage

[](#basic-usage)

The package automatically configures the Canvas LMS Kit when your application boots. You can immediately use all Canvas API classes:

```
use CanvasLMS\Api\Courses\Course;
use CanvasLMS\Api\Enrollments\Enrollment;
use CanvasLMS\Api\Assignments\Assignment;

// Get all courses
$courses = Course::get();

// Get a specific course
$course = Course::find(123);

// Create a course
$course = Course::create([
    'name' => 'Introduction to Laravel',
    'course_code' => 'LAR101',
]);

// Update a course
$course->name = 'Advanced Laravel';
$course->save();
```

### Multi-Tenant Support

[](#multi-tenant-support)

Perfect for SaaS applications managing multiple Canvas instances:

```
use CanvasLMS\Laravel\Facades\Canvas;

// Switch to a different Canvas instance
Canvas::connection('school_b');
$courses = Course::get(); // From school_b

// Temporarily use a different connection
Canvas::usingConnection('school_c', function () {
    $course = Course::find(456); // From school_c
});

// Back to default connection
Canvas::connection('main');
```

Configure multiple connections in `config/canvas.php`:

```
'connections' => [
    'main' => [
        'api_key' => env('CANVAS_API_KEY'),
        'base_url' => env('CANVAS_BASE_URL'),
    ],

    'school_b' => [
        'api_key' => env('SCHOOL_B_API_KEY'),
        'base_url' => env('SCHOOL_B_BASE_URL'),
    ],
],
```

### Testing

[](#testing)

Mock Canvas API calls in your tests:

```
use CanvasLMS\Laravel\Testing\CanvasFake;
use CanvasLMS\Api\Courses\Course;

test('creates a course in canvas', function () {
    // Arrange
    $fake = new CanvasFake();
    $fake->fake([
        'courses' => [
            ['id' => 123, 'name' => 'Test Course'],
        ],
    ]);

    // Act
    $courses = Course::get();

    // Assert
    expect($courses)->toHaveCount(1);
    expect($courses[0]->name)->toBe('Test Course');
    $fake->assertApiCallMade('GET', '/courses');
});
```

### Facade Usage (Optional)

[](#facade-usage-optional)

If you prefer facades, you can use the Canvas facade:

```
use CanvasLMS\Laravel\Facades\Canvas;

// These are equivalent:
Course::get();                    // Direct SDK usage
Canvas::courses()::get();         // Via facade

// The facade is most useful for connection management:
Canvas::connection('tenant_2')->courses()::get();
```

🔧 Configuration
---------------

[](#-configuration)

The configuration file (`config/canvas.php`) provides extensive customization options:

```
return [
    // Default connection to use
    'default' => env('CANVAS_CONNECTION', 'main'),

    // Multiple Canvas connections
    'connections' => [
        'main' => [
            // Authentication mode: 'api_key' or 'oauth'
            'auth_mode' => env('CANVAS_AUTH_MODE', 'api_key'),

            // API Key authentication (when auth_mode = 'api_key')
            'api_key' => env('CANVAS_API_KEY'),
            'base_url' => env('CANVAS_BASE_URL'),
            'account_id' => env('CANVAS_ACCOUNT_ID', 1),
            'timeout' => env('CANVAS_TIMEOUT', 30),
            'log_channel' => env('CANVAS_LOG_CHANNEL'),

            // OAuth 2.0 authentication (when auth_mode = 'oauth')
            'oauth_client_id' => env('CANVAS_OAUTH_CLIENT_ID'),
            'oauth_client_secret' => env('CANVAS_OAUTH_CLIENT_SECRET'),
            'oauth_redirect_uri' => env('CANVAS_OAUTH_REDIRECT_URI'),
            'oauth_token' => env('CANVAS_OAUTH_TOKEN'),
            'oauth_refresh_token' => env('CANVAS_OAUTH_REFRESH_TOKEN'),

            // Optional middleware configuration
            'middleware' => [
                'retry' => [
                    'max_attempts' => 3,
                    'delay' => 1000,
                ],
                'rate_limit' => [
                    'wait_on_limit' => true,
                ],
            ],
        ],
    ],

    // Testing configuration
    'testing' => [
        'fake' => env('CANVAS_FAKE', false),
    ],
];
```

🔐 Authentication Methods
------------------------

[](#-authentication-methods)

### API Key Authentication (Default)

[](#api-key-authentication-default)

The simplest authentication method using Canvas API tokens:

```
CANVAS_AUTH_MODE=api_key  # or omit - api_key is default
CANVAS_API_KEY=your-canvas-api-token
```

### OAuth 2.0 Authentication

[](#oauth-20-authentication)

For OAuth-based authentication, switch the auth mode and configure OAuth settings:

```
CANVAS_AUTH_MODE=oauth
CANVAS_OAUTH_CLIENT_ID=your-client-id
CANVAS_OAUTH_CLIENT_SECRET=your-client-secret
CANVAS_OAUTH_REDIRECT_URI=https://yourapp.com/canvas/callback
CANVAS_OAUTH_TOKEN=current-access-token
CANVAS_OAUTH_REFRESH_TOKEN=refresh-token
```

### User Masquerading (Runtime Only)

[](#user-masquerading-runtime-only)

Administrators can make API calls as another user (requires appropriate permissions):

```
use CanvasLMS\Config;

// Masquerade as a specific user for all subsequent calls
Config::asUser(12345);

// Make API calls as that user
$courses = Course::get(); // Returns courses visible to user 12345

// Stop masquerading
Config::stopMasquerading();

// Now calls are made as the authenticated user again
$courses = Course::get();
```

🎨 Artisan Commands
------------------

[](#-artisan-commands)

### Test Connection

[](#test-connection)

Verify your Canvas API connection and see authenticated user info:

```
# Test default connection
php artisan canvas:test

# Test specific connection
php artisan canvas:test --connection=school_b

# Show current configuration
php artisan canvas:test --show-config

# Verbose mode (tests additional endpoints)
php artisan canvas:test -v
```

🧪 Testing Your Integration
--------------------------

[](#-testing-your-integration)

### Using Pest (Recommended)

[](#using-pest-recommended)

```
use CanvasLMS\Laravel\Testing\CanvasFake;

beforeEach(function () {
    $this->canvas = new CanvasFake();
});

test('enrolls user in course', function () {
    // Arrange
    $this->canvas->fake([
        'enrollments' => [
            'id' => 999,
            'user_id' => 123,
            'course_id' => 456,
            'type' => 'StudentEnrollment',
        ],
    ]);

    // Act
    $enrollment = Enrollment::create([
        'enrollment' => [
            'user_id' => 123,
            'course_id' => 456,
            'type' => 'StudentEnrollment',
        ],
    ]);

    // Assert
    expect($enrollment->user_id)->toBe(123);
    $this->canvas->assertEnrollmentCreated(123, 456, 'StudentEnrollment');
});
```

### Available Assertions

[](#available-assertions)

```
$canvas = new CanvasFake();

// Assert specific API calls
$canvas->assertCourseCreated(['name' => 'Laravel 101']);
$canvas->assertEnrollmentCreated($userId, $courseId);
$canvas->assertApiCallMade('GET', '/courses/*');
$canvas->assertApiCallCount(3);
$canvas->assertNoApiCallsMade();
```

🚀 Real-World Examples
---------------------

[](#-real-world-examples)

### Syncing Users from Laravel to Canvas

[](#syncing-users-from-laravel-to-canvas)

```
use App\Models\User;
use CanvasLMS\Api\Users\User as CanvasUser;

class SyncUsersToCanvas
{
    public function handle()
    {
        User::chunk(100, function ($users) {
            foreach ($users as $user) {
                CanvasUser::create([
                    'user' => [
                        'name' => $user->name,
                        'email' => $user->email,
                        'sis_user_id' => $user->id,
                    ],
                ]);
            }
        });
    }
}
```

### Multi-Tenant Course Management

[](#multi-tenant-course-management)

```
use CanvasLMS\Laravel\Facades\Canvas;

class TenantCourseService
{
    public function getCoursesByTenant(string $tenant): array
    {
        return Canvas::connection($tenant)
            ->courses()
            ::get(['per_page' => 100]);
    }

    public function syncCourseAcrossTenants(int $courseId, array $tenants): void
    {
        $sourceCourse = Course::find($courseId);

        foreach ($tenants as $tenant) {
            Canvas::usingConnection($tenant, function () use ($sourceCourse) {
                Course::create([
                    'name' => $sourceCourse->name,
                    'course_code' => $sourceCourse->course_code,
                ]);
            });
        }
    }
}
```

📚 Available Canvas APIs
-----------------------

[](#-available-canvas-apis)

This package provides auto-configuration for all Canvas LMS Kit APIs. Use them directly:

### Core Resources

[](#core-resources)

- `CanvasLMS\Api\Courses\Course` - Course management
- `CanvasLMS\Api\Users\User` - User management
- `CanvasLMS\Api\Accounts\Account` - Account administration

### Course Components

[](#course-components)

- `CanvasLMS\Api\Enrollments\Enrollment` - User enrollments
- `CanvasLMS\Api\Assignments\Assignment` - Assignments and submissions
- `CanvasLMS\Api\Modules\Module` - Course modules and items
- `CanvasLMS\Api\Pages\Page` - Wiki pages
- `CanvasLMS\Api\Sections\Section` - Course sections
- `CanvasLMS\Api\Tabs\Tab` - Course navigation tabs
- `CanvasLMS\Api\Announcements\Announcement` - Course announcements

### Discussions &amp; Communication

[](#discussions--communication)

- `CanvasLMS\Api\DiscussionTopics\DiscussionTopic` - Discussion forums
- `CanvasLMS\Api\Conversations\Conversation` - Internal messaging
- `CanvasLMS\Api\Conferences\Conference` - Web conferences

### Files &amp; Media

[](#files--media)

- `CanvasLMS\Api\Files\File` - File uploads and management
- `CanvasLMS\Api\MediaObjects\MediaObject` - Media/video content

### Grading &amp; Assessment

[](#grading--assessment)

- `CanvasLMS\Api\Quizzes\Quiz` - Quiz creation and management
- `CanvasLMS\Api\QuizSubmissions\QuizSubmission` - Quiz attempts
- `CanvasLMS\Api\Submissions\Submission` - Assignment submissions
- `CanvasLMS\Api\SubmissionComments\SubmissionComment` - Submission feedback
- `CanvasLMS\Api\Rubrics\Rubric` - Grading rubrics
- `CanvasLMS\Api\GradebookHistory\GradebookHistory` - Grade audit trail

### Groups &amp; Collaboration

[](#groups--collaboration)

- `CanvasLMS\Api\Groups\Group` - Student groups
- `CanvasLMS\Api\GroupCategories\GroupCategory` - Group sets

### Outcomes &amp; Standards

[](#outcomes--standards)

- `CanvasLMS\Api\Outcomes\Outcome` - Learning outcomes
- `CanvasLMS\Api\OutcomeGroups\OutcomeGroup` - Outcome organization
- `CanvasLMS\Api\OutcomeResults\OutcomeResult` - Outcome assessments
- `CanvasLMS\Api\OutcomeImports\OutcomeImport` - Bulk outcome imports

### Calendar &amp; Scheduling

[](#calendar--scheduling)

- `CanvasLMS\Api\CalendarEvents\CalendarEvent` - Calendar entries
- `CanvasLMS\Api\AppointmentGroups\AppointmentGroup` - Office hours/appointments

### Admin &amp; Configuration

[](#admin--configuration)

- `CanvasLMS\Api\Admins\Admin` - Account administrators
- `CanvasLMS\Api\FeatureFlags\FeatureFlag` - Feature toggles
- `CanvasLMS\Api\ExternalTools\ExternalTool` - LTI integrations
- `CanvasLMS\Api\ContentMigrations\ContentMigration` - Course copy/import
- `CanvasLMS\Api\Progress\Progress` - Long-running job status

See the [Canvas LMS Kit documentation](https://github.com/jjuanrivvera/canvas-lms-kit) for complete API reference.

🤝 Contributing
--------------

[](#-contributing)

Contributions are welcome! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for details.

### Development

[](#development)

```
# Install dependencies
composer install

# Run tests
composer test

# Run tests with coverage
composer test-coverage

# Format code
composer format

# Run static analysis
composer analyse

# Run all checks
composer check
```

📝 License
---------

[](#-license)

The MIT License (MIT). Please see [License File](LICENSE.md) for more information.

🙏 Credits
---------

[](#-credits)

- [Juan Rivera](https://github.com/jjuanrivvera)
- [All Contributors](../../contributors)

🔗 Related Packages
------------------

[](#-related-packages)

- [Canvas LMS Kit](https://github.com/jjuanrivvera/canvas-lms-kit) - The base PHP SDK
- [Canvas LMS API Documentation](https://canvas.instructure.com/doc/api/) - Official Canvas API docs

🆘 Support
---------

[](#-support)

If you encounter any issues or have questions:

1. Check the [FAQ](#faq) section below
2. Search through [existing issues](https://github.com/jjuanrivvera/canvas-lms-kit-laravel/issues)
3. Create a new issue with a clear description

❓ FAQ
-----

[](#-faq)

**Q: Do I need to manually initialize the Canvas API?**
A: No! This package auto-configures everything when Laravel boots.

**Q: Can I use this with multiple Canvas instances?**
A: Yes! Configure multiple connections and switch between them using `Canvas::connection()`.

**Q: How do I test Canvas API calls?**
A: Use the included `CanvasFake` class to mock API responses in your tests.

**Q: Is this package compatible with Laravel Octane?**
A: Yes, the package is stateless and works with Laravel Octane.

**Q: What Laravel versions are supported?**
A: Laravel 9.x, 10.x, and 11.x are fully supported.

###  Health Score

29

—

LowBetter than 60% of packages

Maintenance61

Regular maintenance activity

Popularity5

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity38

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~1 days

Total

4

Last Release

245d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/743a2aced1e0f0911d79a6a8a4f9c5ad9a276b8589ced050272a5af3e3f4da05?d=identicon)[jjuanrivvera99](/maintainers/jjuanrivvera99)

---

Top Contributors

[![jjuanrivvera99](https://avatars.githubusercontent.com/u/36964855?v=4)](https://github.com/jjuanrivvera99 "jjuanrivvera99 (37 commits)")

---

Tags

canvas-laravelcanvas-lms-laravelcanvas-lms-sdksdkapilaravelsdkcanvaseducationlmscanvas-lms

###  Code Quality

TestsPest

Static AnalysisPHPStan

Code StyleLaravel Pint

Type Coverage Yes

### Embed Badge

![Health badge](/badges/jjuanrivvera-canvas-lms-kit-laravel/health.svg)

```
[![Health](https://phpackages.com/badges/jjuanrivvera-canvas-lms-kit-laravel/health.svg)](https://phpackages.com/packages/jjuanrivvera-canvas-lms-kit-laravel)
```

###  Alternatives

[andreaselia/laravel-api-to-postman

Generate a Postman collection automatically from your Laravel API

1.0k586.2k3](/packages/andreaselia-laravel-api-to-postman)[saloonphp/laravel-plugin

The official Laravel plugin for Saloon

765.7M125](/packages/saloonphp-laravel-plugin)[resend/resend-laravel

Resend for Laravel

1191.4M6](/packages/resend-resend-laravel)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
