Laravel - Лучший способ исправить URL-адрес при каждом запросе? - PullRequest
0 голосов
/ 23 сентября 2019

Каков наилучший способ исправить URL в определенных моделях?У меня есть несколько моделей со слагом и схема URL:

Route::get('/abc/{id}/{slug?}', 'AbcController@show')->name('abc.show');
Route::get('/abc/{id}/{slug?}/def-show', 'AbcDefController@show')->name('abc.def.show');
Route::get('/abc/{id}/{slug?}/def', 'AbcDefController@create')->name('abc.def.create');

На каждом контроллере я спрашиваю это так:

if ($slug !== $abc->slug) {
    return redirect()->to(route([controller-function-specific], [$abc->id, $abc->slug]));
}

return view('[blade-template]', compact(['abc']))->withCanonical($abc->slug);

Какой подход лучше?Я пробовал это с наблюдателями («извлечено»), но мне не нужно это для каждой функции / действия в контроллере (например, «индекс», который перечисляет только все элементы и не нуждается в слаге), а также другой маршрут.

Мое решение работает, но оно избыточно, потому что я вставляю эту конкретную часть во множество функций / действий.Я мог бы записать это в модель, но это не решило бы избыточные вызовы вроде checkSlug ('[ROUTE]').

Есть идеи?

1 Ответ

0 голосов
/ 23 сентября 2019

Использование Явная привязка модели маршрута в вашей RouteServiceProvider boot функции

public function boot()
{
    parent::boot();

    Route::bind('abc', function($value) {
      return \App\Abc::where('id', $value)
                     ->where('slug', $value)->first() ?? 
                      redirect(); // Custom resolution logic here
    });
}

Обратите внимание, что для этого требуется slug точно так же, как ваш if ($slug !== $abc->slug) чек

...