RangeCategoryEnum::class ]; /** * The attributes that should be cast. * * @var array */ protected $casts = [ 'status' => 'bool', 'publish_at' => 'datetime', 'unpublish_at' => 'datetime' ]; /** * Perform any actions required after the model boots. * * @return void * @phpcs:disable Generic.Metrics.CyclomaticComplexity.TooHigh */ protected static function booted() { // phpcs:enable static::creating(function (self $model) { static::assertTitleIsUnique($model->title); ToolboxHelper::assertNoInternalBoUrls('description', $model->description); ToolboxHelper::assertNoInternalBoUrls('argumentation', $model->argumentation); $model->slug = Str::slug($model->title); $model->description = clean($model->description); $model->argumentation = clean($model->argumentation); $model->picture = FileStorageHelper::storeFile($model, $model->picture); $model->picture_thumb = FileStorageHelper::storeFile($model, $model->picture_thumb); if (!$model->status) { $model->publish_at = null; } else { $model->unpublish_at = null; } if ($model->link1) { self::validateLinkAttribute('link1', $model->link1); } if ($model->link2) { self::validateLinkAttribute('link2', $model->link2); } }); static::updating(function (self $model) { static::assertTitleIsUnique($model->title, $model->id); ToolboxHelper::assertNoInternalBoUrls('description', $model->description); ToolboxHelper::assertNoInternalBoUrls('argumentation', $model->argumentation); if ($model->picture != $model->getOriginal('picture')) { $model->picture = FileStorageHelper::storeFile($model, $model->picture); } if ($model->picture_thumb != $model->getOriginal('picture_thumb')) { $model->picture_thumb = FileStorageHelper::storeFile($model, $model->picture_thumb); } // * If status changed if (\boolval($model->getOriginal('status')) !== $model->status) { if ($model->status) { $model->publish_at = null; Session::flash('info', trans('La gamme est à présent publié')); } else { $model->unpublish_at = null; Session::flash('warning', trans('La gamme est à présent dépublié')); } } if ($model->link1) { self::validateLinkAttribute('link1', $model->link1); } if ($model->link2) { self::validateLinkAttribute('link2', $model->link2); } }); static::updated(function (self $model) { if ($model->picture != $model->getOriginal('picture')) { $model->picture = FileStorageHelper::removeOldFile($model, 'picture'); } if ($model->picture_v != $model->getOriginal('picture_v')) { $model->picture_v = FileStorageHelper::removeOldFile($model, 'picture_v'); } }); static::deleting(function (self $model) { FileStorageHelper::removeFile($model, 'picture'); FileStorageHelper::removeFile($model, 'picture_v'); }); } // * METHODS /** * Asserts using validation that the title is unique * * @param mixed $title * @param integer|null $id * @return void * @throws \Illuminate\Validation\ValidationException If an actu title already exists. */ private static function assertTitleIsUnique($title, ?int $id = null) { $table = (new self())->getTable(); ToolboxHelper::assertFieldIsUnique($table, 'title', $title, $id); ToolboxHelper::assertFieldIsUnique($table, 'slug', Str::slug($title), $id); } /** * Validates an internal link * * @param string $attribute * @param string $value * @return void * @throws \Illuminate\Validation\ValidationException If the $attribute link is invalid. */ public static function validateLinkAttribute(string $attribute, string $value): void { // Validate case internal url. $params = collect(\explode('#', \ltrim(\rtrim($value, '#'), '#'))); if ( !\in_array( $params->get(0), [Breeder::class, Recipe::class] ) ) { throw ValidationException::withMessages([ $attribute => trans('Le lien contient un modèle invalide \':model\'', [ 'model' => $params->get(0) ]) ]); } // Check if model id exists. Param 0 is class, 1 is id. if (!\forward_static_call([$params->get(0), 'find'], $params->get(1))) { throw ValidationException::withMessages([ $attribute => trans('Le lien n\'est plus valide.') ]); } } }