ldc-legaulois/app/Models/OldSlugable.php

105 lines
2.6 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
/**
* Keeps all old slugs for any model associated
* Slug must be unique.
*
* @package App\Models
*/
class OldSlugable extends Model
{
/**
* Indicates if the model should be timestamped.
*
* @var boolean
*/
public $timestamps = false;
/**
* The attributes that are mass assignable.
*
* @var string[]
*/
protected $fillable = [
'slug'
];
/**
* Perform any actions required after the model boots.
*
* @return void
*/
protected static function booted()
{
// * EVENT CLOSURES.
static::creating(function (self $model) {
self::removeSameSlugs($model->oldSlugable, $model->oldSlugable->slug ?? '');
});
static::created(function (self $model) {
$className = (new \ReflectionClass($model->oldSlugable))->getShortName();
session()->flash('info', trans(
'Le slug [:className -> \':oldSlug\'] redirige maintenant vers [:className -> \':newSlug\']',
[
'className' => $className,
'oldSlug' => $model->slug,
'newSlug' => $model->oldSlugable->slug
]
));
});
}
// * RELATIONSHIPS
/**
* morphTo product or range
*
* @return \Illuminate\Database\Eloquent\Relations\morphTo
*/
public function oldSlugable()
{
return $this->morphTo();
}
// * METHODS
/**
* Insert an oldSlug
*
* @param \Illuminate\Database\Eloquent\Model $model
* @return void
* @phpcs:ignore Squiz.Commenting.FunctionComment.EmptyThrows
* @throws \Illuminate\Database\ClassMorphViolationException
*/
public static function insertSlug(Model $model)
{
if ($model->getOriginal('slug') === $model->slug) {
return;
}
$oldSlugable = new self([
'slug' => $model->getOriginal('slug')
]);
$oldSlugable->oldSlugable()->associate($model);
$oldSlugable->saveOrFail();
}
/**
* Remove old slugs that are duplicated
*
* @param \Illuminate\Database\Eloquent\Model $model
* @param string $slug
* @return void
*/
public static function removeSameSlugs(Model $model, string $slug)
{
// * Remove Old of class type
self::query()
->where('slug', $slug)
->where('old_slugable_type', \get_class($model))
->delete();
}
}