с первым согласен - не учел, отчасти поэтому не делают подобные слаги, что со временем слаг одной страницы может перекочевать под другую, что совсем не хорошо с точки зрения сео
А это уже, как заказчик пожелает. Вряд ли ему захочется, чтоб страница о компании (site.ru/about) называлась site.ru/125-about
И в примере выше - не перекочевывают. А меняют slug у одной и той же записи (4 раза). И со старых трех (которые многократно проиндексированы), нужно сделать редирект (301) на единственно верный.
Так уж получилось, что в проекте нужно использовать SLUG. Причем это поле пользователь должен задавать руками. Отсюда вытекат большая вероятность отшибок/опечаток и желание изменить slug после его создания. Знаю два варианта решения:
Меняют не только после создания, а чтобы попасть в семантическое ядро. Или после разработки нового сайта с новыми путями и сохранением ссылочной массы. Причин - много...
=============
по второму это слишком не правильно, чтобы приводить даже для примера, общий обработчик ошибок не должен быть заточен под такую узкую задачу - через него же все ошибки проходят, почему он вдруг только этими редиректами занимается?
Он не занимается только ими. А занимается и ими тоже.
Он отлавливает ошибки вида - PageNotFound, и устанавливает, действительно ли это так или есть редирект.
Еще раз (с уточнением)
Код: Выделить всё
class PageController extends Controller
{
public function actionView($slug)
{
$model = PageItem::find()->where(['slug' => $slug])->published()->one();
if (!$model) {
throw new NotFoundHttpException(\Yii::t('frontend', 'Page not found'));
}
}
}
class Redirect extends ErrorHandler
{
/**
* @param \Exception $exception
*/
public function handleException($exception): void
{
if ($exception instanceof NotFoundHttpException) {
/** @var SeoRedirect $redirectModel */
$redirectModel = SeoRedirect::find()
->where(['old_url' => Yii::$app->request->url])
->asArray()
->one();
if (!$redirectModel) {
$redirectStatus = $redirectModel['code'] ?: 301;
header('Location: ' . $redirectModel['new_url'], true, $redirectStatus);
exit;
}
}
parent::handleException($exception);
}
}
У Вас есть другое решение?