PHP code example of sierratecnologia / media-manager

1. Go to this page and download the library: Download sierratecnologia/media-manager library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

sierratecnologia / media-manager example snippets


'providers' => [
    // ...
    MediaManager\MediaManagerProvider::class,
],

'aliases' => [
    // ...
    'MediaManager' => MediaManager\Facades\MediaManager::class,
    'FileService' => MediaManager\Services\FileService::class,
],

'disks' => [
    's3' => [
        'driver' => 's3',
        'key' => env('AWS_ACCESS_KEY_ID'),
        'secret' => env('AWS_SECRET_ACCESS_KEY'),
        'region' => env('AWS_DEFAULT_REGION'),
        'bucket' => env('AWS_BUCKET'),
    ],

    'google' => [
        'driver' => 'google',
        'clientId' => env('GOOGLE_DRIVE_CLIENT_ID'),
        'clientSecret' => env('GOOGLE_DRIVE_CLIENT_SECRET'),
        'refreshToken' => env('GOOGLE_DRIVE_REFRESH_TOKEN'),
        'folderId' => env('GOOGLE_DRIVE_FOLDER_ID'),
    ],
],

// src/Repositories/ImageRepository.php
class ImageRepository
{
    public function find($id)
    {
        return Image::find($id);
    }

    public function saveFromUpload($file, $directory = 'images')
    {
        // Lógica de persistência
    }
}

// src/Services/FileService.php
class FileService
{
    public static function saveFile($fileName, $directory = '', $fileTypes = [])
    {
        // Validação, processamento e armazenamento
    }
}

// src/Events/MediaFileAdded.php
class MediaFileAdded
{
    public $media;

    public function __construct($media)
    {
        $this->media = $media;
    }
}

// src/Observers/MediaObserver.php
class MediaObserver
{
    public function created(Media $media)
    {
        // Gerar thumbnails, processar metadata, etc.
    }
}

use MediaManager\Services\FileService;

$result = FileService::saveFile('documento', 'uploads/documentos', ['pdf', 'docx']);

// Retorna:
// [
//     'original' => 'contrato.pdf',
//     'name' => 'uploads/documentos/a3f8b9c2d1e4f5a6b7c8d9e0f1a2b3c4.pdf'
// ]

$result = FileService::saveClone('/path/to/file.jpg', 'clones/', ['jpg', 'png']);

use MediaManager\Entities\Uploads\ImageService;

$imageService = app(ImageService::class);

$image = $imageService->save(
    request()->file('imagem'),
    'produtos/',
    [
        'resize' => ['width' => 1200, 'height' => 800],
        'thumbnail' => true,
        'watermark' => true,
    ]
);

use MediaManager\Builders\ThumbnailBuilder;

$thumbnail = ThumbnailBuilder::create()
    ->forMedia($media)
    ->withDimensions(300, 200)
    ->withQuality(85)
    ->build();

use MediaManager\Services\ImagineImageProcessor;

$processor = app(ImagineImageProcessor::class);

$processedImage = $processor->resize($imagePath, 800, 600);
$croppedImage = $processor->crop($imagePath, 400, 400, 'center');
$watermarked = $processor->watermark($imagePath, $watermarkPath, 'bottom-right');

// Salvar em S3
Storage::disk('s3')->put($path, $contents);

// Salvar em Google Drive
Storage::disk('google')->put($path, $contents);

// Salvar em Dropbox
Storage::disk('dropbox')->put($path, $contents);

$localPath = 'uploads/video.mp4';
$s3Path = 'videos/video.mp4';

// Copiar de local para S3
Storage::disk('s3')->put(
    $s3Path,
    Storage::disk('local')->get($localPath)
);

use MediaManager\Services\FileService;

// URL pública protegida
$publicUrl = FileService::fileAsPublicAsset('private/documento.pdf');
// Retorna: /public-asset/eyJpdiI6IkR...

// URL de download
$downloadUrl = FileService::fileAsDownload('private/arquivo.zip', 'Arquivo.zip');
// Retorna: /public-download/eyJpdiI6...

// routes/web.php
Route::get('/public-asset/{encrypted}', [FilesController::class, 'publicAsset'])
    ->middleware(['auth', 'can:view-media']);

Route::get('/public-download/{encrypted}/{name}', [FilesController::class, 'download'])
    ->middleware(['auth', 'can:download-media']);

use MediaManager\Elements\VideoEncoder;

$encoder = new VideoEncoder();

$encoded = $encoder->encode(
    '/path/to/video.mp4',
    'outputs/encoded.mp4',
    [
        'resolution' => '1280x720',
        'bitrate' => '2000k',
        'codec' => 'h264',
    ]
);

use MediaManager\Models\Playlist;
use MediaManager\Models\Video;

$playlist = Playlist::create([
    'name' => 'Tutoriais Laravel',
    'description' => 'Série de tutoriais sobre Laravel',
    'is_public' => true,
]);

$playlist->videos()->attach([1, 2, 3, 4]);



namespace App\Http\Controllers;

use Illuminate\Http\Request;
use MediaManager\Services\FileService;
use MediaManager\Entities\Uploads\ImageService;
use MediaManager\Models\Media;
use App\Models\Product;

class ProductController extends Controller
{
    protected $imageService;

    public function __construct(ImageService $imageService)
    {
        $this->imageService = $imageService;
    }

    public function store(Request $request)
    {
        $request->validate([
            'name' => '                   'small' => [300, 300],
                    'medium' => [600, 600],
                    'large' => [1200, 1200],
                ],
            ]
        );

        // Associar imagem ao produto
        $product->media()->attach($image->id, ['type' => 'main_image']);

        return response()->json([
            'message' => 'Produto criado com sucesso',
            'product' => $product->load('media'),
            'image_url' => $image->getUrl(),
            'thumbnails' => $image->thumbnails->map->getUrl(),
        ], 201);
    }

    public function show(Product $product)
    {
        $mainImage = $product->media()
            ->wherePivot('type', 'main_image')
            ->first();

        return view('products.show', [
            'product' => $product,
            'image' => $mainImage,
            'thumbnails' => $mainImage?->thumbnails ?? collect(),
        ]);
    }
}

use Illuminate\Support\Facades\Storage;
use MediaManager\Models\Media;

// Salvar arquivo no storage configurado
$path = Storage::disk('s3')->put('uploads', $request->file('arquivo'));

// Registrar no MediaManager
$media = Media::create([
    'disk' => 's3',
    'file_name' => basename($path),
    'mime_type' => $request->file('arquivo')->getMimeType(),
    'size' => $request->file('arquivo')->getSize(),
    'collection_name' => 'uploads',
]);

// Recuperar URL pública
$url = Storage::disk('s3')->url($media->file_name);

use MediaManager\Services\FileService;

// Em uma view Blade
$previewUrl = FileService::filePreview($media->getDiskPath());

<img src="{{ $previewUrl }}" alt="{{ $media->name }}">

// config/imagecache.php
return [
    'route' => 'imagecache',
    'path' => public_path('imagecache'),
    'lifetime' => 43200, // 30 dias
];

// Uso
<img src="{{ route('imagecache', ['template' => 'medium', 'filename' => $image->path]) }}">

// Carregar apenas quando necessário
$media = Media::find($id);
$thumbnails = $media->thumbnails()->orderBy('width')->get();

// .env
AWS_CLOUDFRONT_URL=https://d111111abcdef8.cloudfront.net

// config/filesystems.php
's3' => [
    'driver' => 's3',
    'url' => env('AWS_CLOUDFRONT_URL'),
    // ...
],

// Registrar imagem de post
$post->addMedia($request->file('featured_image'))
     ->toMediaCollection('featured');

// Recuperar
$featuredImage = $post->getFirstMedia('featured');

$product->addMultipleMediaFromRequest(['gallery'])
        ->each(fn ($fileAdder) => $fileAdder->toMediaCollection('gallery'));

$media->metadata()->create([
    'key' => 'geolocation',
    'value' => json_encode([
        'lat' => $request->latitude,
        'lng' => $request->longitude,
    ]),
]);

// Padrão de upload em qualquer microserviço
$media = app(ImageService::class)->save(
    $file,
    $directory,
    $options
);

// Garantia de consistência e reutilização



namespace App\Storage;

use League\Flysystem\Adapter\AbstractAdapter;

class CloudflareR2Adapter extends AbstractAdapter
{
    protected $client;

    public function __construct($config)
    {
        $this->client = new R2Client($config);
    }

    public function write($path, $contents, Config $config)
    {
        return $this->client->upload($path, $contents);
    }

    // Implementar outros métodos...
}



namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Storage;
use App\Storage\CloudflareR2Adapter;

class CloudflareR2ServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Storage::extend('r2', function ($app, $config) {
            return new CloudflareR2Adapter($config);
        });
    }
}

'disks' => [
    'r2' => [
        'driver' => 'r2',
        'account_id' => env('R2_ACCOUNT_ID'),
        'access_key_id' => env('R2_ACCESS_KEY_ID'),
        'secret_access_key' => env('R2_SECRET_ACCESS_KEY'),
        'bucket' => env('R2_BUCKET'),
    ],
],



namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\UploadedFile;

class ValidateImageDimensions
{
    public function handle($request, Closure $next)
    {
        if ($request->hasFile('image')) {
            $image = $request->file('image');

            if ($image instanceof UploadedFile) {
                [$width, $height] = getimagesize($image->path());

                if ($width < 800 || $height < 600) {
                    return response()->json([
                        'error' => 'Imagem deve ter no mínimo 800x600 pixels'
                    ], 422);
                }
            }
        }

        return $next($request);
    }
}

Route::post('/upload', [UploadController::class, 'store'])
     ->middleware(['auth', ValidateImageDimensions::class]);



namespace App\Events;

use MediaManager\Models\Media;

class ImageProcessed
{
    public $media;
    public $thumbnails;

    public function __construct(Media $media, array $thumbnails)
    {
        $this->media = $media;
        $this->thumbnails = $thumbnails;
    }
}



namespace App\Listeners;

use App\Events\ImageProcessed;
use Illuminate\Support\Facades\Cache;

class CacheImageMetadata
{
    public function handle(ImageProcessed $event)
    {
        Cache::put(
            "media:{$event->media->id}:metadata",
            [
                'thumbnails' => $event->thumbnails,
                'url' => $event->media->getUrl(),
            ],
            now()->addDays(7)
        );
    }
}

protected $listen = [
    ImageProcessed::class => [
        CacheImageMetadata::class,
        NotifyAdminOfNewImage::class,
    ],
];



namespace App\Traits;

use MediaManager\Models\Media;

trait HasGallery
{
    public function gallery()
    {
        return $this->morphMany(Media::class, 'model')
                    ->where('collection_name', 'gallery')
                    ->orderBy('order_column');
    }

    public function addToGallery($file, $order = 0)
    {
        return $this->gallery()->create([
            'file_name' => $file,
            'order_column' => $order,
        ]);
    }
}

// Uso
class Product extends Model
{
    use HasGallery;
}

$product->addToGallery($uploadedFile);

// Upload manual, sem padronização
$path = $request->file('image')->store('public/images');
$url = Storage::url($path);

// Problemas:
// - Sem thumbnails automáticos
// - Sem validação consistente
// - Sem controle de acesso
// - Difícil de escalar para S3/CDN

use MediaManager\Entities\Uploads\ImageService;

$imageService = app(ImageService::class);

$media = $imageService->save(
    $request->file('image'),
    'cms/posts/',
    [
        'thumbnail' => true,
        'sizes' => ['small' => [150, 150], 'medium' => [600, 400]],
    ]
);

$post->media()->attach($media->id);

// Benefícios:
// ✅ Thumbnails automáticos
// ✅ Validação embutida
// ✅ URLs criptografadas
// ✅ Suporte a múltiplos drivers
// ✅ Cache de imagens



namespace Market\Http\Controllers;

use Market\Models\Product;
use MediaManager\Entities\Uploads\ImageService;

class ProductImageController extends Controller
{
    public function uploadGallery(Request $request, Product $product)
    {
        $request->validate([
            'images.*' => '              'resize' => ['width' => 1500, 'height' => 1500],
                    'sizes' => [
                        'thumb' => [150, 150],
                        'catalog' => [400, 400],
                        'zoom' => [1500, 1500],
                    ],
                ]
            );

            $product->media()->attach($media->id, [
                'collection' => 'gallery',
                'order' => $index,
            ]);

            $uploadedMedia[] = $media;
        }

        return response()->json([
            'message' => 'Galeria atualizada com sucesso',
            'images' => $uploadedMedia,
        ]);
    }
}

use MediaManager\Models\File;
use MediaManager\Services\FileService;
use Tracking\Services\TrackingService;

class DocumentController extends Controller
{
    public function upload(Request $request)
    {
        $result = FileService::saveFile(
            $request->file('documento'),
            'documentos/juridico/',
            ['pdf', 'docx', 'xlsx']
        );

        $file = File::create([
            'name' => $result['original'],
            'path' => $result['name'],
            'user_id' => auth()->id(),
            'department' => 'juridico',
        ]);

        // Rastreamento com Tracking
        TrackingService::track('document.uploaded', [
            'file_id' => $file->id,
            'filename' => $result['original'],
            'user' => auth()->user()->email,
        ]);

        // URL segura de download
        $downloadUrl = FileService::fileAsDownload(
            $result['name'],
            $result['original']
        );

        return response()->json([
            'file' => $file,
            'download_url' => $downloadUrl,
        ]);
    }
}
bash
# Publicar configurações do MediaManager
php artisan vendor:publish --provider="MediaManager\MediaManagerProvider" --tag=config

# Publicar views (opcional)
php artisan vendor:publish --provider="MediaManager\MediaManagerProvider" --tag=views

# Publicar migrations
php artisan vendor:publish --provider="MediaManager\MediaManagerProvider" --tag=migrations

# Executar migrations
php artisan migrate