105 lines
2.6 KiB
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();
|
|
}
|
|
}
|