Installation
Installation
Installation
Laracrate installs like any Laravel package. You pull it in with Composer, publish the config, run the migrations, and point your collections at a storage disk. The package ships sensible defaults, so a basic image upload works with almost no setup.
Prerequisites
See the Requirements section for the full list. In short you need PHP 8.2 or higher and Laravel 12 or higher.
Install with Composer
composer require edulazaro/laracrate
The service provider is auto-discovered, so there is nothing to register manually.
Publish the config and run migrations
Publish the config file, then migrate. The migrations create the package tables (all prefixed laracrate_) and are timestamped 0000_00_00 so they run before your own migrations.
php artisan vendor:publish --tag=laracrate-config php artisan migrate
You only need the config tag to get started. The package loads its migrations, views, and translations directly from the package directory, so publishing those is optional and only needed when you want to customize them.
| Tag | What it copies | Destination |
|---|---|---|
laracrate-config |
The config file | config/laracrate.php |
laracrate-migrations |
The migration files | database/migrations |
laracrate-views |
The Blade views (uploader themes, etc.) | resources/views/vendor/laracrate |
laracrate-translations |
The language files | lang/vendor/laracrate |
After publishing config, clear the cache if you have it cached:
php artisan config:clear
Declare your disks
Laracrate never stores storage credentials. It reuses Laravel's Storage::disk(), so every collection points at a disk you define in config/filesystems.php. The default config in config/laracrate.php ships collections that reference two disks, media and documents, so define those (or rename the collections to match disks you already have).
For production on S3 or Cloudflare R2, add an s3 driver disk. R2 is S3-compatible, so the same driver works, you just set R2 credentials and endpoint:
// config/filesystems.php 'disks' => [ // S3 or Cloudflare R2 (R2 uses the same s3 driver) 'media' => [ 'driver' => 's3', 'key' => env('R2_ACCESS_KEY_ID'), 'secret' => env('R2_SECRET_ACCESS_KEY'), 'region' => env('R2_DEFAULT_REGION', 'auto'), 'bucket' => env('R2_BUCKET'), 'endpoint' => env('R2_ENDPOINT'), 'use_path_style_endpoint' => true, 'throw' => true, ], 'documents' => [ 'driver' => 's3', 'key' => env('R2_ACCESS_KEY_ID'), 'secret' => env('R2_SECRET_ACCESS_KEY'), 'region' => env('R2_DEFAULT_REGION', 'auto'), 'bucket' => env('R2_DOCUMENTS_BUCKET'), 'endpoint' => env('R2_ENDPOINT'), 'use_path_style_endpoint' => true, 'throw' => true, ], ],
For local development you can point the same disk names at the local filesystem so you do not need a bucket while building:
// config/filesystems.php (local dev) 'media' => [ 'driver' => 'local', 'root' => storage_path('app/media'), 'url' => env('APP_URL') . '/storage/media', 'visibility' => 'public', 'throw' => true, ],
Recommended: use real object storage in development too. The local driver above is the quickest way to start, but for consistency with production it is strongly recommended to point your development disks at S3-compatible storage instead: either a free Cloudflare R2 bucket, or a local MinIO instance. The direct-upload flow (presigned PUT, multipart, and the server-side copyObject move from temp/ to the canonical key) relies on real S3/R2 semantics that the local driver only emulates through signed-route fallbacks, so building against R2 or MinIO surfaces problems the local driver would otherwise hide. MinIO uses the same s3 driver shown above: point endpoint at your MinIO URL (for example http://localhost:9000) and keep use_path_style_endpoint => true.
Each collection declares its own disk in config/laracrate.php. The package raises an error on purpose if a collection has no disk, so there is no silent default. See the Configuration section for the full collection schema and the Multi-tenancy, buckets and usage section for per-tenant bucket overrides.