Upload for S3, Copy, Local, Anything, Manipulate and Attach Images in your Models, (*1)
  
  Current Build Status, (*2)
 
 
 , (*3)
, (*3)
  
  Statistics, (*4)
 
 
 
 , (*5)
, (*5)
 
 
 , (*6)
, (*6)
  
  Tips, (*7)
 , (*8)
, (*8)
Installation
1 - Dependency
The first step is using composer to install the package and automatically update your composer.json file, you can do this by running:, (*9)
composer require artesaos/attacher
or manually update your composer.json file, (*10)
{
    "require": {
        "artesaos/attacher": "~0.6"
    }
}
2 - Provider
You need to update your application configuration in order to register the package so it can be loaded by Laravel, just update your config/app.php file adding the following code at the end of your 'providers' section:, (*11)
// file START ommited
    'providers' => [
        // other providers ommited
        \Artesaos\Attacher\Providers\AttacherServiceProvider::class,
    ],
// file END ommited
3 - Facade
  
  Optional. You do not need to register the Facade of Attacher, but if you want to have access to some shortcuts feel free to use it., (*12)
In order to use the Attacher facade, you need to register it on the config/app.php file, you can do that the following way:, (*13)
<?php
# config/app.php
// file START ommited
    'aliases' => [
        // other Facades ommited
        'Attacher'   => \Artesaos\Attacher\Facades\Attacher::class,
    ],
// file END ommited
3.1 - Facade API
Attacher::process(Model $model);
Attacher::getPath();
Attacher::setPath($path);
Attacher::setBaseURL($url);
Attacher::getProcessor();
Attacher::getInterpolator();
4 - Configuration
Run in your console php artisan vendor:publish, now you have 3 new files, config/attacher.php, config/flysystem.php and database/migrations/2015_03_28_000000_create_attacher_images_table.php, (*14)
  
  Attacher need graham-campbell/flysystem
  Don't worry, Attacher registers the flysystem service automatically for you., (*15)
In the config/app.php file, you can configure the destination path and the styles guides to manipulate the images., (*16)
return [
    'model'    => 'Artesaos\Attacher\AttacherModel', # You can customize the model for your needs.
    'base_url' => '', # The url basis for the representation of images.
    'path'     => '/uploads/images/:id/:style/:filename', # Change the path where the images are stored.
    'style_guides'   => [
        'default' => [
            # If you set the original style all other styles used his return to base
            'original'=> function($image)
            {
                return $image->insert('public/watermark.png');
            },
            # Generate thumb (?x500)
            'thumb' => function ($image) {
                $image->resize(null, 500, function ($constraint) {
                    $constraint->aspectRatio();
                    $constraint->upsize();
                });
                return $image;
            },
        ],
        'my_custom_style' => [
            # Generate thumb (460x120)
            'cover' => function ($image) {
                $image->fit(460, 120);
                return $image;
            }
        ],
    ]
];
Usage
The usage is very simple.
The image destination information are in flysystem configuration file config/flysystem.php there you define which provider to use for uploading., (*17)
1 - Basic
$upload = Input::file('image');
$image = new \Artesaos\Attacher\AttacherModel();
$image->setupFile($upload); # attach image
$image->save(); # now attacher process file (generate styles and save in your provider configured in flysystem)
echo $image->url('original');
echo $image->url('thumb'); // your style
1.1 - Using Styles Guide
Using a specific guide style to manipulate the images:, (*18)
$upload = Input::file('image');
$image = new \Artesaos\Attacher\AttacherModel();
$image->setupFile($upload, 'custom_style'); # attach image using the "custom_style"
$image->save();
echo $image->url('cover'); // The "cover" setted in "my_custom_style" of the config/attacher.php file
It is possible to change the style setted in config/attacher.php, by passing an array keyed by the style guide and the style that you wish to change. The array values should be Closure instances which receive the \Intervention\Image\Image:, (*19)
$upload = Input::file('image');
$image = new \Artesaos\Attacher\AttacherModel();
$image->setupFile($upload, [
    'my_custom_style' => [
        # Generate thumb (30x30)
        'cover' => function ($image) {
            $image->fit(30, 30);
            return $image;
        }
    ]
]); # attach image using the "my_custom_style" changed by Closure
$image->save();
echo $image->url('cover'); // Now, the "cover" generates a resized image of 30 by 30 pixels
Or use dot notation to change style:, (*20)
$upload = Input::file('image');
$image = new \Artesaos\Attacher\AttacherModel();
$image->setupFile($upload, [
    'my_custom_style.cover' => function ($image) {
        $image->fit(30, 30);
        return $image;
    }
]); # attach image using the "my_custom_style" changed by Closure
$image->save();
echo $image->url('cover'); // Now, the "cover" generates a resized image of 30 by 30 pixels
2 - Traits
Attacher provides you two traits to facilitate the creation of galleries/collections of images linked to other objects using the technique morphMany and morphOne, (*21)
2.1 - HasImages
Bond with many images, (*22)
#app/Project.php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Artesaos\Attacher\Traits\HasImage;
class Projects extends Model
{
    use HasImages;
    protected $table = 'projects';
}
////
$upload = Input::file('image');
$project = Projects::find(73);
$image = $project->addImage($upload); # Create a new image, save model and save image file with your styles
echo $image->url('thumbnail');
////
$project = Projects::find(73);
# Collection of images
$images = $project->images;
  
  The method addImage() has the same attributes of the method setupFile() of the AttachModel:, (*23)
$model->addImage(UploadedFile $image, $styleGuide = null, $type = null);
2.2 - HasImage [WIP]
Link to an image, (*24)
#app/People.php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Artesaos\Attacher\Traits\HasImage;
class People extends Model
{
    use HasImage;
    protected $table = 'people';
}
////
$upload = Input::file('image');
$people = People::find(73);
$image = $people->addImage($upload); # Create a new image, save model and save image file with your styles
echo $image->url('thumbnail');
////
$people = People::find(73);
echo $people->image->url('original');
  
  The method addImage() has the same attributes of the method setupFile() of the AttachModel:, (*25)
$model->addImage(UploadedFile $image, $styleGuide = null, $type = null);
3 - Setting a Image Model Type
Sometimes you may need to specify a type of image model. For example, when a product there are images for listing and images for gallery.
To do so, just pass additional third argument to the method:, (*26)
$people = People::find(73);
$upload = Input::file('image');
$people->addImage($upload, 'default', 'listing'); # attach image using the "listing" custom guide style
$upload2 = Input::file('image2');
$people->addImage($upload2, 'default', 'gallery'); # attach image using the "gallery" custom guide style
$listingImages = $people->images->ofType('listing'); // Get images of the listing
$galleryImages = $people->images->ofType('gallery'); // Get images of the gallery
Author
Vinicius Reis, (*27)