src/Service/ImagePathHelper.php line 29
<?phpnamespace App\Service;use App\Entity\Vehicle;use App\Entity\VehicleImage;use RuntimeException;class ImagePathHelper{private string $oldImageDir;private string $newImageDir;private string $publicDir;public function __construct(string $publicDir){$this->publicDir = $publicDir;$this->oldImageDir = $publicDir . '/img-vehicle-old';$this->newImageDir = $publicDir . '/img-vehicle';}/*** @param Vehicle $vehicle* @param VehicleImage|null $image* @param string|null $filename* @param bool $useSeoFilename* @return string*/public function getNewImagePath(Vehicle $vehicle, VehicleImage $image = null, string $filename = null, bool $useSeoFilename = true): string{$dealerId = $vehicle->getDealer()?->getId();$vehicleId = $vehicle->getId();if (!$dealerId || !$vehicleId) {throw new RuntimeException('Vehicle must have dealer and ID to generate hierarchical path');}$actualFilename = $filename;if ($useSeoFilename && $image?->getSeoFilename()) {$actualFilename = $image->getSeoFilename();} elseif ($image && !$filename) {$actualFilename = $image->getName();}if (!$actualFilename) {throw new RuntimeException('Filename must be provided or image must have name/seoFilename');}return sprintf('%s/%d/%d/%s',$this->newImageDir,$dealerId,$vehicleId,$actualFilename);}/*** @param Vehicle $vehicle* @param string $filename Original filename (tc_*.jpg)* @return string*/public function getNewImagePathByFilename(Vehicle $vehicle, string $filename): string{$dealerId = $vehicle->getDealer()?->getId();$vehicleId = $vehicle->getId();if (!$dealerId || !$vehicleId) {throw new RuntimeException('Vehicle must have dealer and ID to generate hierarchical path');}return sprintf('%s/%d/%d/%s',$this->newImageDir,$dealerId,$vehicleId,$filename);}/*** @param string $filename* @return string*/public function getOldImagePath(string $filename): string{return $this->oldImageDir . '/' . $filename;}/*** @param Vehicle $vehicle* @param string $filename* @return string*/public function getNewImageWebPath(Vehicle $vehicle, string $filename): string{$dealerId = $vehicle->getDealer()?->getId();$vehicleId = $vehicle->getId();if (!$dealerId || !$vehicleId) {throw new RuntimeException('Vehicle must have dealer and ID to generate web path');}return sprintf('/img-vehicle-new/%d/%d/%s',$dealerId,$vehicleId,$filename);}/*** @param Vehicle $vehicle* @return string*/public function getVehicleImageDirectory(Vehicle $vehicle): string{$dealerId = $vehicle->getDealer()?->getId();$vehicleId = $vehicle->getId();if (!$dealerId || !$vehicleId) {throw new RuntimeException('Vehicle must have dealer and ID to generate directory path');}return sprintf('%s/%d/%d',$this->newImageDir,$dealerId,$vehicleId);}/*** @param Vehicle $vehicle* @return void*/public function ensureVehicleDirectoryExists(Vehicle $vehicle): void{$dir = $this->getVehicleImageDirectory($vehicle);if (!is_dir($dir)) {if (!mkdir($dir, 0755, true) && !is_dir($dir)) {throw new RuntimeException('Failed to create directory: ' . $dir);}@chown($dir, 'www-data');@chgrp($dir, 'www-data');}}/*** @param string $filename* @return bool*/public function oldImageExists(string $filename): bool{$path = $this->getOldImagePath($filename);return file_exists($path) && !is_link($path) && filesize($path) > 0;}/*** @param Vehicle $vehicle* @param string $filename* @return bool*/public function newImageExists(Vehicle $vehicle, string $filename): bool{$path = $this->getNewImagePath($vehicle, null, $filename);return file_exists($path) && !is_link($path) && filesize($path) > 0;}/*** Get file size of old image** @param string $filename* @return int|false*/public function getOldImageSize(string $filename): int|false{$path = $this->getOldImagePath($filename);return @filesize($path);}public function getOldImageDir(): string{return $this->oldImageDir;}public function getNewImageDir(): string{return $this->newImageDir;}public function getPublicDir(): string{return $this->publicDir;}}