Installation
composer require eur-rsm/laravel-bynder
Publish the config file:
php artisan vendor:publish --provider="EurRsm\LaravelBynder\BynderServiceProvider"
Configuration
Edit .env with Bynder API credentials:
BYNDER_CLIENT_ID=your_client_id
BYNDER_CLIENT_SECRET=your_client_secret
BYNDER_REDIRECT_URI=http://your-app.test/callback
BYNDER_BASE_URL=https://your-bynder-instance.bynder.net
First Use Case: Authentication Redirect users to Bynder for OAuth:
use EurRsm\LaravelBynder\Facades\Bynder;
// Redirect to Bynder auth
return Bynder::auth()->redirect();
// Handle callback (in a route)
$token = Bynder::auth()->handleCallback();
Verify Installation Check if the package is connected:
if (Bynder::auth()->check()) {
$user = Bynder::auth()->user();
dd($user); // Should return Bynder user data
}
Uploading Assets
$asset = Bynder::assets()->create([
'name' => 'Project Logo',
'file' => fopen('logo.png', 'r'),
'folder_id' => 123,
]);
Fetching Assets
$assets = Bynder::assets()->all(['folder_id' => 123]);
$asset = Bynder::assets()->find(456);
Downloading Assets
$file = Bynder::assets()->download(456, 'local_path/logo.png');
Create/Update Folders
$folder = Bynder::folders()->create([
'name' => 'Marketing Assets',
'parent_id' => 123,
]);
Recursive Folder Listing
$folders = Bynder::folders()->all(['recursive' => true]);
Basic Search
$results = Bynder::search()->assets([
'q' => 'logo',
'limit' => 10,
]);
Advanced Filters
$results = Bynder::search()->assets([
'q' => 'brochure',
'folder_id' => 123,
'sort' => '-modified',
]);
Attach Assets to Eloquent Models
// In a model
public function assets()
{
return $this->morphToMany(Asset::class, 'model');
}
// Sync assets
$post->assets()->sync([123, 456]);
Policy-Based Access
// In a policy
public function viewAny(User $user)
{
return Bynder::auth()->check() && $user->can('view_bynder_assets');
}
// In EventServiceProvider
Bynder::webhooks()->listen('asset.created', function ($payload) {
// Handle new asset creation
});
Caching Responses Use Laravel’s cache to reduce API calls:
$assets = Cache::remember('bynder_assets_123', now()->addHours(1), function () {
return Bynder::assets()->all(['folder_id' => 123]);
});
Queue Long-Running Tasks Offload heavy operations (e.g., bulk uploads) to queues:
UploadAssetJob::dispatch($file, $folderId)->onQueue('bynder');
Laravel Mix/Valet/Forge
For local development, use .env overrides:
BYNDER_BASE_URL=http://bynder.test
Testing Use mocks in PHPUnit:
Bynder::shouldReceive('assets()->all')->andReturn([$mockAsset]);
OAuth Flow Issues
BYNDER_REDIRECT_URI in .env and Bynder’s app settings.config/bynder.php:
'debug' => env('BYNDER_DEBUG', false),
Rate Limiting
Bynder::throttle() middleware for routes:
Route::middleware(['throttle:bynder'])->group(function () {
// Bynder-heavy routes
});
File Size Limits
$request->validate([
'file' => 'max:10240', // 10MB
]);
Folder Permissions
403 Forbidden when accessing folders.Webhook Delays
idempotency_keys in payloads to avoid duplicate processing.Enable Verbose Logging
// In config/bynder.php
'log' => [
'enabled' => true,
'path' => storage_path('logs/bynder.log'),
],
Inspect Raw API Responses
$response = Bynder::assets()->all();
dd($response->getRawResponse());
Common HTTP Errors
Bynder::auth()->refresh().Custom API Endpoints Extend the client for unsupported endpoints:
// In a service provider
Bynder::extend(function ($client) {
$client->custom = new CustomEndpoint($client);
});
// Usage
Bynder::custom()->fetchData();
Event Dispatching Trigger Laravel events on Bynder actions:
Bynder::assets()->onCreate(function ($asset) {
event(new AssetUploaded($asset));
});
Middleware for Auth Protect routes requiring Bynder auth:
Route::middleware(['bynder.auth'])->group(function () {
// Protected routes
});
Service Provider Overrides Bind custom implementations:
$this->app->bind('bynder', function () {
return new CustomBynderClient();
});
Base URL Handling
BYNDER_BASE_URL includes the protocol (https://) and no trailing slash.https://company.bynder.net (not /).Timeouts
'http' => [
'timeout' => 60, // seconds
],
Default Folder ID
config/bynder.php:
'defaults' => [
'folder_id' => 123,
],
Environment-Specific Settings
Use Laravel’s config/bynder.php to override per environment:
'environments' => [
'local' => [
'base_url' => 'http://bynder.test',
],
],
How can I help you explore Laravel packages today?