Skip to content

Commit

Permalink
Fix exception handling in FlysystemStorage (#1473)
Browse files Browse the repository at this point in the history
* Fix exception handling in FlysystemStorage

Related to #1445

Add handling for UndefinedMethodError exception in FlysystemStorage.

* Catch both `FilesystemException` and `UndefinedMethodError` exceptions in the `publicUrl` method of `src/Storage/FlysystemStorage.php`.
* Add a test case in `tests/Storage/Flysystem/AbstractFlysystemStorageTestCase.php` to check for `UndefinedMethodError` exception handling in the `resolveUri` method.
* Ensure the test case covers both exceptions to maintain compatibility with different Flysystem versions.
  • Loading branch information
regis-martini authored Oct 31, 2024
1 parent 5eb6c3a commit 8e34781
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 1 deletion.
3 changes: 2 additions & 1 deletion src/Storage/FlysystemStorage.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
use League\Flysystem\MountManager;
use Psr\Container\ContainerInterface;
use Symfony\Component\HttpFoundation\File\Exception\CannotWriteFileException;
use Symfony\Component\ErrorHandler\Error\UndefinedMethodError;
use Symfony\Component\HttpFoundation\File\File;
use Vich\UploaderBundle\Mapping\PropertyMapping;
use Vich\UploaderBundle\Mapping\PropertyMappingFactory;
Expand Down Expand Up @@ -97,7 +98,7 @@ public function resolveUri(object|array $obj, ?string $fieldName = null, ?string

try {
return $fs->publicUrl($path);
} catch (FilesystemException) {
} catch (FilesystemException|UndefinedMethodError) {
return $mapping->getUriPrefix().'/'.$path;
}
}
Expand Down
33 changes: 33 additions & 0 deletions tests/Storage/Flysystem/AbstractFlysystemStorageTestCase.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace Vich\UploaderBundle\Tests\Storage\Flysystem;

use Error;
use League\Flysystem\Filesystem;
use League\Flysystem\FilesystemAdapter;
use League\Flysystem\FilesystemOperator;
Expand All @@ -12,6 +13,7 @@
use Vich\UploaderBundle\Storage\FlysystemStorage;
use Vich\UploaderBundle\Storage\StorageInterface;
use Vich\UploaderBundle\Tests\Storage\StorageTestCase;
use Symfony\Component\ErrorHandler\Error\UndefinedMethodError;

/**
* @author Markus Bachmann <markus.bachmann@bachi.biz>
Expand Down Expand Up @@ -209,4 +211,35 @@ public function testResolveUriThroughFlysystem(): void

self::assertEquals('example.com/file.txt', $path);
}

public function testResolveUriHandlesUndefinedMethodError(): void
{
$this->useFlysystemToResolveUri = true;

$this->filesystem
->expects(self::once())
->method('publicUrl')
->with('file.txt')
->will($this->throwException(new UndefinedMethodError('Undefined method', new Error('An error occurred'))));

$this->mapping
->expects(self::once())
->method('getFileName')
->willReturn('file.txt');

$this->mapping
->expects(self::once())
->method('getUriPrefix')
->willReturn('/uploads');

$this->factory
->expects(self::exactly(2))
->method('fromField')
->with($this->object, 'file_field')
->willReturn($this->mapping);

$path = $this->getStorage()->resolveUri($this->object, 'file_field');

self::assertEquals('/uploads/file.txt', $path);
}
}

0 comments on commit 8e34781

Please sign in to comment.