Skip to content

Commit

Permalink
Upgrade to spatie/image v3
Browse files Browse the repository at this point in the history
  • Loading branch information
gdebrauwer committed Aug 2, 2024
1 parent 9e6eb97 commit 74496e2
Show file tree
Hide file tree
Showing 8 changed files with 163 additions and 19 deletions.
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
"illuminate/contracts": "^10.0|^11.0",
"livewire/livewire": "^3.0",
"owenvoke/blade-fontawesome": "^2.2",
"spatie/image": "^2.2",
"spatie/image": "^3.0",
"spatie/laravel-package-tools": "^1.12",
"spatie/laravel-translatable": "^6.3"
},
Expand Down
20 changes: 12 additions & 8 deletions src/Conversions/LocalConversion.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@ public function convert(Attachment $attachment, Format $format, bool $force = fa
$formatName = $format->filename($attachment);
$savePath = $attachment->absolute_directory_path . '/' . $formatName;

if (array_key_exists('format', $format->definition()->toArray()[0])) {
if (!empty($format->definition()->toArray()['format'])) {
$savePath = Str::replaceLast(
$attachment->extension,
$format->definition()->toArray()[0]['format'],
$format->definition()->toArray()['format'],
$savePath
);
}
Expand All @@ -31,9 +31,11 @@ public function convert(Attachment $attachment, Format $format, bool $force = fa
$force ||
! $attachment->getStorage()->exists("$attachment->directory/$formatName")
) {
Image::load($attachment->absolute_file_path)
->manipulate($format->definition())
->save($savePath);
$image = Image::load($attachment->absolute_file_path);

$format->definition()->apply($image);

$image->save($savePath);
}

if (
Expand All @@ -42,9 +44,11 @@ public function convert(Attachment $attachment, Format $format, bool $force = fa
! $attachment->getStorage()->exists(WebP::path($savePath, $attachment->extension))
)
) {
Image::load($attachment->absolute_file_path)
->manipulate($format->definition())
->save(WebP::path($savePath, $attachment->extension));
$image = Image::load($attachment->absolute_file_path);

$format->definition()->apply($image);

$image->save(WebP::path($savePath, $attachment->extension));
}

return true;
Expand Down
1 change: 0 additions & 1 deletion src/Formats/Format.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
use Codedor\MediaLibrary\Models\Attachment;
use Illuminate\Contracts\Support\Arrayable;
use Illuminate\Support\Str;
use Spatie\Image\Manipulations;

abstract class Format implements Arrayable
{
Expand Down
138 changes: 138 additions & 0 deletions src/Formats/Manipulations.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
<?php

namespace Codedor\MediaLibrary\Formats;

use Spatie\Image\Drivers\ImageDriver;
use Spatie\Image\Enums\AlignPosition;
use Spatie\Image\Enums\BorderType;
use Spatie\Image\Enums\Constraint;
use Spatie\Image\Enums\CropPosition;
use Spatie\Image\Enums\Fit;
use Spatie\Image\Enums\FlipDirection;

/** @mixin \Spatie\Image\Drivers\ImageDriver */
class Manipulations
{
protected array $manipulations = [];

public function __construct(array $manipulations = [])
{
$this->manipulations = $manipulations;
}

public function __call(string $method, array $parameters): self
{
$this->addManipulation($method, $parameters);

return $this;
}

public function addManipulation(string $name, array $parameters = []): self
{
$this->manipulations[$name] = $parameters;

return $this;
}

public function getManipulationArgument(string $manipulationName): null|string|array
{
return $this->manipulations[$manipulationName] ?? null;
}

public function getFirstManipulationArgument(string $manipulationName): null|string|int
{
$manipulationArgument = $this->getManipulationArgument($manipulationName);

if (! is_array($manipulationArgument)) {
return null;
}

return $manipulationArgument[0];
}

public function isEmpty(): bool
{
return count($this->manipulations) === 0;
}

public function apply(ImageDriver $image): void
{
foreach ($this->manipulations as $manipulationName => $parameters) {
$parameters = $this->transformParameters($manipulationName, $parameters);
$image->$manipulationName(...$parameters);
}
}

public function mergeManipulations(self $manipulations): self
{
foreach ($manipulations->toArray() as $name => $parameters) {
$this->manipulations[$name] = array_merge($this->manipulations[$name] ?? [], $parameters ?: []);
}

return $this;
}

public function removeManipulation(string $name): self
{
unset($this->manipulations[$name]);

return $this;
}

public function toArray(): array
{
return $this->manipulations;
}

public function transformParameters(int|string $manipulationName, mixed $parameters): mixed
{
switch ($manipulationName) {
case 'border':
if (isset($parameters['type']) && ! $parameters['type'] instanceof BorderType) {
$parameters['type'] = BorderType::from($parameters['type']);
}
break;
case 'watermark':
if (isset($parameters['fit']) && ! $parameters['fit'] instanceof Fit) {
$parameters['fit'] = Fit::from($parameters['fit']);
}
// Fallthrough intended for position
case 'resizeCanvas':
case 'insert':
if (isset($parameters['position']) && ! $parameters['position'] instanceof AlignPosition) {
$parameters['position'] = AlignPosition::from($parameters['position']);
}
break;
case 'resize':
case 'width':
case 'height':
if (isset($parameters['constraints']) && is_array($parameters['constraints'])) {
foreach ($parameters['constraints'] as &$constraint) {
if (! $constraint instanceof Constraint) {
$constraint = Constraint::from($constraint);
}
}
}
break;
case 'crop':
if (isset($parameters['position']) && ! $parameters['position'] instanceof CropPosition) {
$parameters['position'] = CropPosition::from($parameters['position']);
}
break;
case 'fit':
if (isset($parameters['fit']) && ! $parameters['fit'] instanceof Fit) {
$parameters['fit'] = Fit::from($parameters['fit']);
}
break;
case 'flip':
if (isset($parameters['flip']) && ! $parameters['flip'] instanceof FlipDirection) {
$parameters['flip'] = FlipDirection::from($parameters['flip']);
}
break;
default:
break;
}

return $parameters;
}
}
4 changes: 2 additions & 2 deletions src/Formats/Thumbnail.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
namespace Codedor\MediaLibrary\Formats;

use Codedor\MediaLibrary\Models\Attachment;
use Spatie\Image\Manipulations;
use Spatie\Image\Enums\Fit;

class Thumbnail extends Format
{
Expand All @@ -15,7 +15,7 @@ class Thumbnail extends Format

public function definition(): Manipulations
{
return $this->manipulations->fit(Manipulations::FIT_CROP, 350, 350);
return $this->manipulations->fit(Fit::Crop, 350, 350);

Check failure on line 18 in src/Formats/Thumbnail.php

View workflow job for this annotation

GitHub Actions / phpstan

Method Codedor\MediaLibrary\Formats\Thumbnail::definition() should return Codedor\MediaLibrary\Formats\Manipulations but returns Spatie\Image\Drivers\ImageDriver.
}

public function registerModelsForFormatter(): void
Expand Down
5 changes: 3 additions & 2 deletions tests/TestFormats/TestHero.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@
namespace Codedor\MediaLibrary\Tests\TestFormats;

use Codedor\MediaLibrary\Formats\Format;
use Codedor\MediaLibrary\Formats\Manipulations;
use Codedor\MediaLibrary\Tests\TestModels\TestModel;
use Spatie\Image\Manipulations;
use Spatie\Image\Enums\Fit;

class TestHero extends Format
{
Expand All @@ -13,7 +14,7 @@ class TestHero extends Format
public function definition(): Manipulations
{
return $this->manipulations
->fit(Manipulations::FIT_CROP, 100, 100)
->fit(Fit::Crop, 100, 100)
->sepia();
}

Expand Down
7 changes: 4 additions & 3 deletions tests/TestFormats/TestHeroWebp.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@
namespace Codedor\MediaLibrary\Tests\TestFormats;

use Codedor\MediaLibrary\Formats\Format;
use Codedor\MediaLibrary\Formats\Manipulations;
use Codedor\MediaLibrary\Tests\TestModels\TestModel;
use Spatie\Image\Manipulations;
use Spatie\Image\Enums\Fit;

class TestHeroWebp extends Format
{
Expand All @@ -13,8 +14,8 @@ class TestHeroWebp extends Format
public function definition(): Manipulations
{
return $this->manipulations
->fit(Manipulations::FIT_CROP, 100, 100)
->format(Manipulations::FORMAT_WEBP)
->fit(Fit::Crop, 100, 100)
->format('webp')
->sepia();
}

Expand Down
5 changes: 3 additions & 2 deletions tests/TestFormats/TestNoHeight.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@
namespace Codedor\MediaLibrary\Tests\TestFormats;

use Codedor\MediaLibrary\Formats\Format;
use Codedor\MediaLibrary\Formats\Manipulations;
use Codedor\MediaLibrary\Tests\TestModels\TestModel;
use Spatie\Image\Manipulations;
use Spatie\Image\Enums\Fit;

class TestNoHeight extends Format
{
Expand All @@ -13,7 +14,7 @@ class TestNoHeight extends Format
public function definition(): Manipulations
{
return $this->manipulations
->fit(Manipulations::FIT_CROP, 100)
->fit(Fit::Crop, 100)
->sepia();
}

Expand Down

0 comments on commit 74496e2

Please sign in to comment.