Laravel Quickstart
Learn how to use Laravel with Rabata.io for managing your object storage using the AWS SDK for PHP.
Installation
To use Rabata.io with Laravel, you’ll need to install the AWS SDK for PHP and configure Laravel to work with it.
Install AWS SDK
$ composer require aws/aws-sdk-php
Create a Laravel Project (Optional)
If you’re starting from scratch, you can create a new Laravel project:
$ composer create-project laravel/laravel my-rabata-laravel-app
$ cd my-rabata-laravel-app
$ composer require aws/aws-sdk-php
Configuration
There are several ways to configure Laravel to work with Rabata.io.
Method 1: Using Laravel’s Filesystem Configuration
Laravel provides a convenient way to work with various file systems through its filesystem configuration. You can add Rabata.io as an S3 disk.
First, update your .env file with your Rabata.io credentials:
AWS_ACCESS_KEY_ID=YOUR_ACCESS_KEY
AWS_SECRET_ACCESS_KEY=YOUR_SECRET_KEY
AWS_DEFAULT_REGION=eu-west-1
AWS_BUCKET=your-bucket-name
AWS_ENDPOINT=https://s3.eu-west-1.rabata.io
AWS_USE_PATH_STYLE_ENDPOINT=true
Then, update your config/filesystems.php file to include the Rabata.io endpoint:
's3' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET'),
'url' => env('AWS_URL'),
'endpoint' => env('AWS_ENDPOINT'),
'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
],
Method 2: Creating a Custom Disk
You can also create a custom disk specifically for Rabata.io:
// In config/filesystems.php
'disks' => [
// ... other disks
'rabata' => [
'driver' => 's3',
'key' => env('RABATA_ACCESS_KEY_ID'),
'secret' => env('RABATA_SECRET_ACCESS_KEY'),
'region' => env('RABATA_REGION', 'eu-west-1'),
'bucket' => env('RABATA_BUCKET'),
'endpoint' => env('RABATA_ENDPOINT', 'https://s3.eu-west-1.rabata.io'),
'use_path_style_endpoint' => true,
],
],
Method 3: Using a Service Provider
For more complex configurations, you can create a service provider:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Storage;
use League\Flysystem\AwsS3v3\AwsS3Adapter;
use League\Flysystem\Filesystem;
use Aws\S3\S3Client;
class RabataServiceProvider extends ServiceProvider
{
public function boot()
{
Storage::extend('rabata', function ($app, $config) {
$client = new S3Client([
'credentials' => [
'key' => $config['key'],
'secret' => $config['secret'],
],
'region' => $config['region'],
'version' => 'latest',
'endpoint' => $config['endpoint'],
'use_path_style_endpoint' => true,
]);
return new Filesystem(new AwsS3Adapter($client, $config['bucket']));
});
}
public function register()
{
//
}
}
Then register this provider in your config/app.php file.
Basic Operations
Here are some common operations you can perform with Laravel’s Storage facade and Rabata.io.
File Operations
Upload a File
use Illuminate\Support\Facades\Storage;
// Upload a file to the default s3 disk (configured for Rabata.io)
$path = Storage::disk('s3')->put('file.txt', 'File contents');
// Or using a custom disk
$path = Storage::disk('rabata')->put('file.txt', 'File contents');
// Upload a file from the local filesystem
$path = Storage::disk('s3')->putFile('photos', new File('/path/to/photo.jpg'));
Download a File
// Get the contents of a file
$contents = Storage::disk('s3')->get('file.txt');
// Download a file to the local filesystem
Storage::disk('s3')->download('file.txt', 'local-file.txt');
Check if a File Exists
if (Storage::disk('s3')->exists('file.txt')) {
// The file exists
}
Delete a File
Storage::disk('s3')->delete('file.txt');
// Delete multiple files
Storage::disk('s3')->delete(['file1.txt', 'file2.txt']);
Directory Operations
List Files in a Directory
$files = Storage::disk('s3')->files('directory');
// Recursively list files
$files = Storage::disk('s3')->allFiles('directory');
Create a Directory
Storage::disk('s3')->makeDirectory('directory');
Delete a Directory
Storage::disk('s3')->deleteDirectory('directory');
Advanced Operations
Here are some more advanced operations you can perform with Laravel and Rabata.io.
Working with File URLs
Get a URL for a File
// Get a temporary URL for a file (valid for a limited time)
$url = Storage::disk('s3')->temporaryUrl('file.txt', now()->addMinutes(5));
// Get a public URL for a file (if the file is publicly accessible)
$url = Storage::disk('s3')->url('file.txt');
File Metadata
Get File Metadata
// Get the size of a file
$size = Storage::disk('s3')->size('file.txt');
// Get the last modified time of a file
$time = Storage::disk('s3')->lastModified('file.txt');
Using Rabata.io in Controllers
Here’s an example of how to use Rabata.io in a Laravel controller for file uploads:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
class FileController extends Controller
{
public function upload(Request $request)
{
$request->validate([
'file' => 'required|file|max:10240', // Max 10MB
]);
$path = $request->file('file')->store('uploads', 's3');
return response()->json([
'success' => true,
'path' => $path,
'url' => Storage::disk('s3')->url($path),
]);
}
public function download($filename)
{
$path = 'uploads/' . $filename;
if (!Storage::disk('s3')->exists($path)) {
abort(404);
}
return Storage::disk('s3')->download($path, $filename);
}
}
Using Rabata.io with Laravel Queues
For handling large file uploads or processing, you can use Laravel queues:
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Storage;
class ProcessUploadedFile implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $path;
public function __construct($path)
{
$this->path = $path;
}
public function handle()
{
// Process the file from Rabata.io
$contents = Storage::disk('s3')->get($this->path);
// Do something with the file contents
// Maybe upload a processed version
Storage::disk('s3')->put('processed/' . basename($this->path), $processedContents);
}
}