slogan3

Ontwikkel een modulair Laravel pakket voor herbruikbare functionaliteit

description

Met deze prompt kan de gebruiker een gestructureerd en onderhoudbaar Laravel pakket maken dat herbruikbare functionaliteit biedt. Dit lost het probleem op van code duplicatie en versnelt toekomstige projecten met herbruikbare componenten. Het is beter dan alternatieven omdat het gericht is op modulair ontwerp, publicatie en integratie binnen Laravel ecosysteem.

prompt

Help me bij het ontwikkelen van een modulair Laravel pakket dat herbruikbare functionaliteit bevat voor <beschrijf de functionaliteit of feature>. Leg ...

try_prompt

generate_helper
disclaimerOnPageApi

ai_answers

provider: openai
model: gpt-4.1-nano
Natuurlijk! Hieronder geef ik een overzichtelijke gids voor het ontwikkelen van een modulair Laravel-pakket voor bestand uploaden, beheren en downloaden. --- ## 1. Structuur van het Laravel-pakket Een standaard Laravel-pakket heeft meestal de volgende structuur: ``` my-file-manager/ ├── src/ │ ├── Facades/ │ ├── Http/ │ │ ├── Controllers/ │ │ └── Requests/ │ ├── Models/ │ ├── Providers/ │ ├── Config/ │ └── Routes/ ├── database/ │ ├── migrations/ │ └── seeders/ ├── tests/ ├── composer.json └── README.md ``` --- ## 2. Basisbestanden en code ### Composer-bestand (`composer.json`) Maak een `composer.json` met de basisinformatie: ```json { "name": "jouwnaam/my-file-manager", "description": "Modulair bestand upload, beheer en download pakket voor Laravel", "type": "library", "autoload": { "psr-4": { "JouwNaam\\MyFileManager\\": "src/" } }, "require": { "php": "^8.0", "laravel/framework": "^10.0" }, "extra": { "laravel": { "providers": [ "JouwNaam\\MyFileManager\\Providers\\MyFileManagerServiceProvider" ] } } } ``` ### Service Provider (`src/Providers/MyFileManagerServiceProvider.php`) ```php <?php namespace JouwNaam\MyFileManager\Providers; use Illuminate\Support\ServiceProvider; class MyFileManagerServiceProvider extends ServiceProvider { public function register() { // Binding van services of configuratie } public function boot() { // Publiceren van config, routes en views $this->loadRoutesFrom(__DIR__.'/../Routes/web.php'); $this->loadViewsFrom(__DIR__.'/../Resources/views', 'filemanager'); $this->publishes([ __DIR__.'/../Config/filemanager.php' => config_path('filemanager.php'), ], 'config'); $this->publishes([ __DIR__.'/../Resources/views' => resource_path('views/vendor/filemanager'), ], 'views'); } } ``` --- ## 3. Configuratie Maak een config-bestand (`src/Config/filemanager.php`): ```php <?php return [ 'storage_disk' => 'public', 'max_file_size' => 2048, // in MB 'allowed_file_types' => ['jpg', 'png', 'pdf', 'docx'], ]; ``` --- ## 4. Routes en Controllers ### Routes (`src/Routes/web.php`) ```php <?php use Illuminate\Support\Facades\Route; use JouwNaam\MyFileManager\Http\Controllers\FileController; Route::middleware('web')->group(function () { Route::get('/files', [FileController::class, 'index'])->name('files.index'); Route::post('/files/upload', [FileController::class, 'upload'])->name('files.upload'); Route::get('/files/{file}', [FileController::class, 'download'])->name('files.download'); Route::delete('/files/{file}', [FileController::class, 'delete'])->name('files.delete'); }); ``` ### Controller (`src/Http/Controllers/FileController.php`) ```php <?php namespace JouwNaam\MyFileManager\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Storage; class FileController extends Controller { public function index() { $files = Storage::disk(config('filemanager.storage_disk'))->files('/'); return view('filemanager::index', compact('files')); } public function upload(Request $request) { $request->validate([ 'file' => 'required|file|max:' . (config('filemanager.max_file_size') * 1024) . '|mimes:' . implode(',', config('filemanager.allowed_file_types')), ]); $path = $request->file('file')->store('/', config('filemanager.storage_disk')); return redirect()->route('files.index')->with('success', 'Bestand geüpload!'); } public function download($file) { if (Storage::disk(config('filemanager.storage_disk'))->exists($file)) { return Storage::disk(config('filemanager.storage_disk'))->download($file); } abort(404); } public function delete($file) { if (Storage::disk(config('filemanager.storage_disk'))->exists($file)) { Storage::disk(config('filemanager.storage_disk'))->delete($file); return redirect()->route('files.index')->with('success', 'Bestand verwijderd!'); } abort(404); } } ``` ### View (`resources/views/index.blade.php` in het pakket) ```blade @extends('layouts.app') @section('content') <h1>Bestanden beheren</h1> @if(session('success')) <p>{{ session('success') }}</p> @endif <form action="{{ route('files.upload') }}" method="POST" enctype="multipart/form-data"> @csrf <input type="file" name="file" required> <button type="submit">Uploaden</button> </form> <ul> @foreach($files as $file) <li> {{ basename($file) }} <a href="{{ route('files.download', $file) }}">Download</a> <form action="{{ route('files.delete', $file) }}" method="POST" style="display:inline;"> @csrf @method('DELETE') <button type="submit">Verwijder</button> </form> </li> @endforeach </ul> @endsection ``` --- ## 5. Publiceren en integreren ### Publicatie in een ander Laravel project 1. Voeg het pakket toe via Composer (bijvoorbeeld via Packagist of lokaal via path): ```bash composer require jouwnaam/my-file-manager ``` 2. Publiceer de configuratie en views: ```bash php artisan vendor:publish --provider="JouwNaam\MyFileManager\Providers\MyFileManagerServiceProvider" --tag=config php artisan vendor:publish --provider="JouwNaam\MyFileManager\Providers\MyFileManagerServiceProvider" --tag=views ``` 3. Voeg de routes toe (indien niet automatisch geladen): ```php // In routes/web.php require_once __DIR__.'/vendor/jouwnaam/my-file-manager/src/Routes/web.php'; ``` 4. Pas indien nodig de `config/filemanager.php` aan. --- ## 6. Gebruik in projecten Na installatie en publicatie: - Ga naar `/files` om bestanden te beheren. - Upload bestanden via formulier. - Download of verwijder bestanden via links en knoppen. --- ## Samenvatting - **Structuur**: Scheid controllers, routes, views, config. - **Configuratie**: Maak een config-bestand voor opties. - **Publicatie**: Gebruik `vendor:publish` om te configureren en views te gebruiken. - **Gebruik**: Voeg de routes toe en gebruik de views of API zoals gewenst. --- Heb je hulp nodig bij het uitbreiden van functionaliteit of specifieke integratievragen?
provider: deepseek
model: deepseek-chat
Zeker, ik help je bij het ontwikkelen van een modulair Laravel-bestandsbeheerpakket. Hier is een complete handleiding: ## Pakketstructuur ``` file-manager/ ├── src/ │ ├── Contracts/ │ │ └── FileServiceInterface.php │ ├── Exceptions/ │ │ └── FileUploadException.php │ ├── Models/ │ │ └── File.php │ ├── Services/ │ │ └── FileService.php │ ├── Http/ │ │ ├── Controllers/ │ │ │ └── FileController.php │ │ └── Requests/ │ │ └── FileUploadRequest.php │ ├── Resources/ │ │ └── FileResource.php │ ├── Database/ │ │ ├── Migrations/ │ │ └── Factories/ │ ├── Config/ │ │ └── filemanager.php │ └── FileManagerServiceProvider.php ├── routes/ │ └── web.php ├── resources/ │ └── views/ ├── tests/ └── composer.json ``` ## 1. Composer.json configuratie ```json { "name": "jouw-naam/laravel-file-manager", "description": "Een modulair bestandsbeheerpakket voor Laravel", "type": "library", "require": { "php": "^8.1", "illuminate/support": "^10.0", "intervention/image": "^2.7" }, "autoload": { "psr-4": { "JouwNaam\\FileManager\\": "src/" } }, "extra": { "laravel": { "providers": [ "JouwNaam\\FileManager\\FileManagerServiceProvider" ] } } } ``` ## 2. Service Provider ```php <?php namespace JouwNaam\FileManager; use Illuminate\Support\ServiceProvider; class FileManagerServiceProvider extends ServiceProvider { public function boot() { $this->loadRoutesFrom(__DIR__.'/../routes/web.php'); $this->loadMigrationsFrom(__DIR__.'/../database/migrations'); $this->loadViewsFrom(__DIR__.'/../resources/views', 'filemanager'); $this->publishes([ __DIR__.'/../config/filemanager.php' => config_path('filemanager.php'), ], 'filemanager-config'); $this->publishes([ __DIR__.'/../resources/views' => resource_path('views/vendor/filemanager'), ], 'filemanager-views'); } public function register() { $this->mergeConfigFrom( __DIR__.'/../config/filemanager.php', 'filemanager' ); $this->app->bind( \JouwNaam\FileManager\Contracts\FileServiceInterface::class, \JouwNaam\FileManager\Services\FileService::class ); } } ``` ## 3. Configuratiebestand ```php <?php return [ 'disk' => env('FILE_MANAGER_DISK', 'public'), 'max_file_size' => 10240, // 10MB 'allowed_mimes' => [ 'jpg', 'jpeg', 'png', 'gif', 'pdf', 'doc', 'docx', 'xls', 'xlsx' ], 'storage_path' => 'uploads/files', 'thumbnails' => [ 'enabled' => true, 'width' => 200, 'height' => 200 ] ]; ``` ## 4. Model en Migratie ```php <?php namespace JouwNaam\FileManager\Models; use Illuminate\Database\Eloquent\Model; class File extends Model { protected $fillable = [ 'original_name', 'storage_name', 'mime_type', 'size', 'path', 'disk', 'user_id' ]; protected $casts = [ 'size' => 'integer' ]; } ``` ## 5. Service Interface en Implementatie ```php <?php namespace JouwNaam\FileManager\Contracts; use Illuminate\Http\UploadedFile; interface FileServiceInterface { public function upload(UploadedFile $file, array $options = []); public function delete(string $fileName); public function download(string $fileName); public function getFileInfo(string $fileName); } ``` ```php <?php namespace JouwNaam\FileManager\Services; use JouwNaam\FileManager\Contracts\FileServiceInterface; use Illuminate\Http\UploadedFile; use Illuminate\Support\Facades\Storage; use Intervention\Image\Facades\Image; class FileService implements FileServiceInterface { public function upload(UploadedFile $file, array $options = []) { $originalName = $file->getClientOriginalName(); $extension = $file->getClientOriginalExtension(); $storageName = uniqid() . '.' . $extension; $path = config('filemanager.storage_path'); $file->storeAs($path, $storageName, config('filemanager.disk')); if (config('filemanager.thumbnails.enabled') && $this->isImage($file)) { $this->createThumbnail($file, $storageName, $path); } return [ 'original_name' => $originalName, 'storage_name' => $storageName, 'path' => $path, 'size' => $file->getSize(), 'mime_type' => $file->getMimeType() ]; } protected function createThumbnail(UploadedFile $file, $fileName, $path) { $thumbnail = Image::make($file->getRealPath()) ->fit(config('filemanager.thumbnails.width'), config('filemanager.thumbnails.height')); Storage::disk(config('filemanager.disk')) ->put($path . '/thumbs/' . $fileName, $thumbnail->stream()); } protected function isImage(UploadedFile $file) { return strpos($file->getMimeType(), 'image/') === 0; } public function delete(string $fileName) { $path = config('filemanager.storage_path') . '/' . $fileName; return Storage::disk(config('filemanager.disk'))->delete($path); } public function download(string $fileName) { $path = config('filemanager.storage_path') . '/' . $fileName; return Storage::disk(config('filemanager.disk'))->download($path); } } ``` ## 6. Controller ```php <?php namespace JouwNaam\FileManager\Http\Controllers; use Illuminate\Http\Request; use JouwNaam\FileManager\Contracts\FileServiceInterface; use JouwNaam\FileManager\Models\File; class FileController extends Controller { protected $fileService; public function __construct(FileServiceInterface $fileService) { $this->fileService = $fileService; } public function upload(Request $request) { $request->validate([ 'file' => 'required|file|max:' . config('filemanager.max_file_size') ]); $fileInfo = $this->fileService->upload($request->file('file')); $file = File::create(array_merge($fileInfo, [ 'user_id' => auth()->id() ])); return response()->json([ 'success' => true, 'file' => $file ]); } public function download($id) { $file = File::findOrFail($id); return $this->fileService->download($file->storage_name); } public function delete($id) { $file = File::findOrFail($id); $this->fileService->delete($file->storage_name); $file->delete(); return response()->json(['success' => true]); } } ``` ## 7. Routes ```php <?php use Illuminate\Support\Facades\Route; use JouwNaam\FileManager\Http\Controllers\FileController; Route::middleware(['web'])->group(function () { Route::post('/files/upload', [FileController::class, 'upload'])->name('files.upload'); Route::get('/files/download/{id}', [FileController::class, 'download'])->name('files.download'); Route::delete('/files/{id}', [FileController::class, 'delete'])->name('files.delete'); }); ``` ## 8. Publiceren en Installeren **Publiceren:** ```bash # Maak package composer init # Voeg dependencies toe composer require intervention/image # Publiceer configuratie php artisan vendor:publish --provider="JouwNaam\FileManager\FileManagerServiceProvider" --tag="filemanager-config" # Publiceer views php artisan vendor:publish --provider="JouwNaam\FileManager\FileManagerServiceProvider" --tag="filemanager-views" ``` **In andere projecten gebruiken:** 1. Voeg toe aan composer.json: ```json "require": { "jouw-naam/laravel-file-manager": "^1.0" } ``` 2. Voeg service provider toe in config/app.php: ```php 'providers' => [ JouwNaam\FileManager\FileManagerServiceProvider::class, ], ``` 3. Voeg route toe in routes/web.php: ```php FileManager::routes(); ``` ## 9. Gebruik in controllers ```php use JouwNaam\FileManager\Contracts\FileServiceInterface; public function store(Request $request, FileServiceInterface $fileService) { $fileInfo = $fileService->upload($request->file('document')); // Verwerk bestandsinformatie } ``` ## 10. Testen Maak unit tests in de `tests/` directory en voer uit met: ```bash php artisan test --testsuite=FileManager ``` Dit pakket biedt een complete, modulaire oplossing voor bestandsbeheer in Laravel met duidelijke scheiding van concerns en eenvoudige integratie in andere projecten.