/**
* Move the file to a new location on disk.
*
* Will invoke the `save()` method on the model after the associated file has been moved to prevent synchronization errors
* @param \Plank\Mediable\Media $media
* @param string $directory directory relative to disk root
* @param string $name filename. Do not include extension
* @return void
* @throws \Plank\Mediable\Exceptions\MediaMoveException If attempting to change the file extension or a file with the same name already exists at the destination
*/
public function move(Media $media, $directory, $filename = null)
{
$storage = $this->filesystem->disk($media->disk);
if ($filename) {
$filename = $this->removeExtensionFromFilename($filename, $media->extension);
} else {
$filename = $media->filename;
}
$directory = trim($directory, '/');
$target_path = $directory . '/' . $filename . '.' . $media->extension;
if ($storage->has($target_path)) {
throw MediaMoveException::destinationExists($target_path);
}
$storage->move($media->getDiskPath(), $target_path);
$media->filename = $filename;
$media->directory = $directory;
$media->save();
}