$minWith ?? $this->minWith, 'minHeight' => $minHeight ?? $this->minHeight, 'maxWith' => $maxWith ?? $this->maxWith, 'maxHeight' => $maxHeight ?? $this->maxHeight ]; return [ $name => [ $required ? 'required' : 'nullable', function (string $attribute, $value, callable $fail) use ($sizes) { return $this->validatePicture($attribute, $value, $fail, $sizes); } ] ]; } /** * Images rules * * @param string $name * @param boolean $required * @param integer|null $minWith * @param integer|null $minHeight * @param integer|null $maxWith * @param integer|null $maxHeight * @param integer|null $limitMin * @param integer|null $limitMax * @return array */ public function picturesRules( string $name = 'pictures', bool $required = true, ?int $minWith = null, ?int $minHeight = null, ?int $maxWith = null, ?int $maxHeight = null, ?int $limitMin = null, ?int $limitMax = null ): array { $sizes = (object)[ 'required' => $required ?? $this->required, 'minWith' => $minWith ?? $this->minWith, 'minHeight' => $minHeight ?? $this->minHeight, 'maxWith' => $maxWith ?? $this->maxWith, 'maxHeight' => $maxHeight ?? $this->maxHeight, 'limitMin' => $limitMin ?? $this->limitMin, 'limitMax' => $limitMax ?? $this->limitMax ]; return [ "{$name}" => ($required ? 'required' : 'nullable') . "|array|between:$limitMin,$limitMax", "{$name}.*" => [ 'required', function (string $attribute, $value, callable $fail) use ($sizes) { return $this->validatePicture($attribute, $value, $fail, $sizes); } ] ]; } /** * Validate picture * * @param string $attribute * @param mixed $value * @param callback $fail * @param object $sizes * @return void * @phpcs:disable Generic.CodeAnalysis.UnusedFunctionParameter.FoundBeforeLastUsed */ private function validatePicture(string $attribute, $value, callable $fail, object $sizes) { if (!File::exists($value)) { $fail(trans(":attribute n'existe pas dans le système de fichier")); return; } if (!\in_array(File::mimeType($value), ['image/jpeg', 'image/jpg', 'image/png', 'image/gif'])) { $fail(trans(":attribute doit être une image de type 'image/jpeg,image/jpg,image/png,image/gif'")); } if (!($dimensions = \getimagesize($value)) or !isset($dimensions[0]) or !isset($dimensions[1])) { $fail(trans(":attribute impossible de valider les dimensions")); } else { $width = intval($dimensions[0]); $height = intval($dimensions[1]); $xMessage = trans( ":attribute la largeur doit être comprise entre {$sizes->minWith}px et {$sizes->maxWith}px" ); if ($sizes->minWith === $sizes->maxWith) { $xMessage = trans(":attribute la largeur doit être de {$sizes->minWith}px"); } $yMessage = trans( ":attribute la hauteur doit être comprise entre {$sizes->minWith}px et {$sizes->maxWith}px" ); if ($sizes->minHeight === $sizes->maxHeight) { $yMessage = trans(":attribute la hauteur doit être de {$sizes->minWith}px"); } if (($width < $sizes->minWith) or ($width > $sizes->maxWith)) { $fail($xMessage); } if (($height < $sizes->minHeight) or ($height > $sizes->maxHeight)) { $fail($yMessage); } } //end if } /** * Merges products pictures fields with request data * * @param string $name * @return void */ protected function mergePicture(string $name = 'picture'): void { $picturePath = $this->{$name}; if (is_string($picturePath)) { $this->merge(["{$name}Validate" => []]); // ! Empty picture. if ($picturePath === 'false') { // * Empty picture and exit $this->merge([$name => []]); return; } $decodedPath = \urldecode($picturePath); $this->merge([ "{$name}Validate" => array_merge( $this->{"{$name}Validate"}, [\public_path(ltrim($decodedPath, '/'))] ) ]); $changedPicture = ltrim($decodedPath, '/'); $this->merge([ $name => $changedPicture ]); } //end if } }