All Projects → optixsolutions → Laravel Media

optixsolutions / Laravel Media

Licence: mit
Attach files to eloquent models

Labels

Projects that are alternatives of or similar to Laravel Media

Laravel
A Vimeo bridge for Laravel
Stars: ✭ 302 (-5.33%)
Mutual labels:  laravel
Laravel Log Enhancer
Make debugging easier by adding more data to your laravel logs (Laravel 5.6+)
Stars: ✭ 311 (-2.51%)
Mutual labels:  laravel
Corcel
Use WordPress backend with Laravel or any PHP application
Stars: ✭ 3,504 (+998.43%)
Mutual labels:  laravel
Laravel Vue I18n Generator
Generates a vue-i18n compatible include file from your Laravel translations
Stars: ✭ 304 (-4.7%)
Mutual labels:  laravel
Mercurius
Real-time Messenger for Laravel
Stars: ✭ 309 (-3.13%)
Mutual labels:  laravel
Finance
A self hosted app to help you get a better understanding of your personal finances.
Stars: ✭ 313 (-1.88%)
Mutual labels:  laravel
Laravel Sketchpad
An innovative front-end environment for interactive Laravel development
Stars: ✭ 302 (-5.33%)
Mutual labels:  laravel
Reading
整理阅读过的干货文章, 帖子
Stars: ✭ 318 (-0.31%)
Mutual labels:  laravel
Homestead Docker
Multi app development container.
Stars: ✭ 310 (-2.82%)
Mutual labels:  laravel
Php Snowflake
❄ An ID Generator for PHP based on Snowflake Algorithm (Twitter announced).
Stars: ✭ 313 (-1.88%)
Mutual labels:  laravel
Laravel Social Auto Posting
🌈Laravel social auto posting
Stars: ✭ 306 (-4.08%)
Mutual labels:  laravel
Laravel Paginateroute
Laravel router extension to easily use Laravel's paginator without the query string
Stars: ✭ 306 (-4.08%)
Mutual labels:  laravel
Laravel5 Jsonapi
Laravel 5 JSON API Transformer Package
Stars: ✭ 313 (-1.88%)
Mutual labels:  laravel
Laravel Starter
A CMS like modular starter application project built with Laravel 8.x.
Stars: ✭ 299 (-6.27%)
Mutual labels:  laravel
Laravel Mail Viewer
View all the mailables in your laravel app at a single place
Stars: ✭ 315 (-1.25%)
Mutual labels:  laravel
Decoy
A Laravel model-based CMS
Stars: ✭ 303 (-5.02%)
Mutual labels:  laravel
Laravel Bookings
Rinvex Bookable is a generic resource booking system for Laravel, with the required tools to run your SAAS like services efficiently. It's simple architecture, accompanied by powerful underlying to afford solid platform for your business.
Stars: ✭ 309 (-3.13%)
Mutual labels:  laravel
Laravel S
LaravelS is an out-of-the-box adapter between Swoole and Laravel/Lumen.
Stars: ✭ 3,479 (+990.6%)
Mutual labels:  laravel
Laravel Query Logger
📝 A dev tool to log all queries for laravel application.
Stars: ✭ 316 (-0.94%)
Mutual labels:  laravel
Nocaptcha
🛂 Helper for Google's new noCAPTCHA (reCAPTCHA v2 & v3)
Stars: ✭ 313 (-1.88%)
Mutual labels:  laravel

Laravel Media

An easy solution to attach files to your eloquent models, with image manipulation built in!

Packagist Version Build Status License

Installation

You can install the package via composer:

composer require optix/media

Once installed, you should publish the provided assets to create the necessary migration and config files.

php artisan vendor:publish --provider="Optix\Media\MediaServiceProvider"

Key concepts

There are a few key concepts that should be understood before continuing:

  • Media can be any type of file, from a jpeg to a zip file. You should specify any file restrictions in your application's validation logic before you attempt to upload a file.

  • Media is uploaded as its own entity. It does not belong to another model in the system when it's created, so items can be managed independently (which makes it the perfect engine for a media manager).

  • Media must be attached to a model for an association to be made.

  • Media items are bound to "groups". This makes it easy to associate multiple types of media to a model. For example, a model might have an "images" group and a "documents" group.

  • You can manipulate images using conversions. You can specify conversions to be performed when a media item is associated to a model. For example, you can register a "thumbnail" conversion to run when images are attached to a model's "gallery" group.

  • Conversions are registered globally. This means that they can be reused across your application, i.e a Post and a User can have the same sized thumbnail without having to register the same conversion twice.

Usage

Upload media

You should use the Optix\Media\MediaUploader class to handle file uploads.

By default, this class will update files to the disk specified in the media config. It saves them as a sanitised version of their original file name, and creates a media record in the database with the file's details.

You can also customise certain properties of the file before it's uploaded.

$file = $request->file('file');

// Default usage
$media = MediaUploader::fromFile($file)->upload();

// Custom usage
$media = MediaUploader::fromFile($file)
    ->useFileName('custom-file-name.jpeg')
    ->useName('Custom media name')
    ->upload();

Associate media with a model

In order to associate a media item with a model, you must first include the Optix\Media\HasMedia trait.

class Post extends Model
{
    use HasMedia;
}

This trait will setup the relationship between your model and the media model. It's primary purpose is to provide a fluent api for attaching and retrieving media.

Once included, you can attach media to the model as demonstrated below. The first parameter of the attach media method can either be a media model instance, an id, or an iterable list of models / ids.

$post = Post::first();

// To the default group
$post->attachMedia($media);

// To a custom group
$post->attachMedia($media, 'custom-group');

Disassociate media from a model

To disassociate media from a model, you should call the provided detachMedia method.

// Detach all the media
$post->detachMedia();

// Detach the specified media
$post->detachMedia($media);

// Detach all the media in a group
$post->clearMediaGroup('your-group');

If you want to delete a media item, you should do it the same way you would for any other model in your application.

Media::first()->delete();

Doing so will delete the file from your filesystem, and also remove any association between the media item and your application's models.

Retrieve media

Another feature of the HasMedia trait is the ability to retrieve media.

// All media in the default group
$post->getMedia();

// All media in a custom group
$post->getMedia('custom-group');

// First media item in the default group 
$post->getFirstMedia();

// First media item in a custom group
$post->getFirstMedia('custom-group');

As well as retrieve media items, you can also retrieve attributes of the media model directly from your model.

// Url of the first media item in the default group
$post->getFirstMediaUrl();

// Url of the first media item in a custom group
$post->getFirstMediaUrl('custom-group');

Manipulate Images

This package provides a fluent api to manipulate images. You can specify a model to perform "conversions" when media is attached to a group. It uses the familiar intervention/image library under the hood, so images can be manipulated using all of the library's provided options.

To get started, you should first register a conversion in one of your application's service providers:

use Intervention\Image\Image;
use Optix\Media\Facades\Conversion;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Conversion::register('thumb', function (Image $image) {
            return $image->fit(64, 64);
        });
    }
}

Once you've registered a conversion, you should configure a media group to perform the conversion when media is attached to your model.

class Post extends Model
{
    use HasMedia;
    
    public function registerMediaGroups()
    {
        $this->addMediaGroup('gallery')
             ->performConversions('thumb');
    }
}

Now when a media item is attached to the "gallery" group, a converted image will be generated. You can get the url of the converted image as demonstrated below:

// The thumbnail of the first image in the gallery group
$post->getFirstMediaUrl('gallery', 'thumb');

Why use this package?

There are already packages that exist to solve a similar problem to the one that this package was built to achieve.

The most popular of which are:

There are a few key differences between this package and the ones listed above. Our package was built to power media managers, and make it easy to perform image manipulations. This is better represented by the comparison table below:

Comparison Spatie Plank Optix
Relationship type One to many Many to many Many to many
Provides image manipulation Yes No Yes
Definition of manipulations Specific to a model - Global registry

License

The MIT License (MIT). Please see License File for more information.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].