Автоматическая маршрутизация Laravel для статических страниц

#php #laravel #routes

#php #laravel #маршруты

Вопрос:

Мне нужно поддерживать сайт для клиента, они сделали это с помощью Laravel, наиболее частые запросы от них — создавать новые статические страницы, и чем больше я их создаю, тем больше я чувствую, что есть определенно лучшие способы их реализации.

Чтобы создать статическую страницу, я захожу в панель администратора, в меню «Статические страницы», нажимаю кнопку «Создать новую» и там создаю запись, которая переходит в таблицу базы данных. Чтобы отобразить статическую страницу на веб-сайте, я должен определить ее в контроллере с именем «FrontEndController» следующим образом:

 public function some_page() {
  $page = StaticPages::find(1);
  return view('frontend.static_pages.some_page', compact('page'));
}

public function some_other_page() {
  $page = StaticPages::find(2);
  return view('frontend.static_pages.some_other_page', compact('page'));
}

...
 

Затем определите маршруты следующим образом:

 Route::get('some-page', 'FrontEndController@some_page')->name('static_page.some_page');

Route::get('some-other-page', 'FrontEndController@some_other_page')->name('static_page.some_other_page');
 

Теперь я всегда думал, что вы создаете панель администратора с меню «Статические страницы» и кнопкой «Создать новый», чтобы вам не приходилось вводить какой-либо код вручную, но, похоже, у разработчика были другие идеи…

Итак, мой вопрос в том, как вы рефакторируете подобный код, чтобы вам не приходилось проходить весь повторяющийся процесс в любом подобном сценарии и писать код вручную?

Кстати, мне может потребоваться иногда отправлять некоторые общие параметры на разные статические страницы, и я хочу, чтобы URL-адреса оставались такими же, какие они есть. Пожалуйста, имейте в виду, что я не очень продвинутый пользователь Laravel или даже PHP.

Ответ №1:

Нет необходимости добавлять дополнительный метод и маршрутизатор для каждой страницы вручную.

Я думаю, что это вопрос неопытного разработчика ,

Итак, вам нужно провести рефакторинг ваших кодов следующим образом.

Добавьте один маршрутизатор и удалите другие.

 Route::get('/static/{id}','FrontendController@index');
 

На вашем контроллере.

 public function index($id)
{
$page = StaticPages::find($id);
$theme = $page->theme; //assume you have save your html themplate name in your table via theme column
return view('frontend.static_pages.'.$theme, compact('page'));
}
 

Комментарии:

1. Но разве тогда я не потерял бы текущие URL-адреса, разве все статические страницы не имели бы путь domain.com/static/1 и domain.com/static/2 т. Д.? Сработало бы, если бы я сделал это так: Route::get('{page}', 'FrontEndController@index'); а затем каким-то образом получал элементы по URL, а не по ID?

2. @Adam Вы можете воспользоваться регулярным выражением, а затем перенаправить свои маршруты в старом стиле на новые. с другой стороны, вы можете изменить свои маршруты следующим образом::get(‘example-page-{id}’, ‘FrontEndController@index’)

3. Извините, если мой вопрос сформулирован неправильно, но текущие URL-адреса не имеют суффикса id, это только примеры. И не могли бы вы объяснить, как я могу использовать регулярное выражение в этой ситуации?

4. @Adam Вы можете перенаправить свои маршруты следующим образом Route::redirect(‘/{example_url}’,’static/{id}’); если ваши пожелания не таковы, вам нужно сохранить свой slug в принадлежащих строках (например, example-page-01,example-page-02 и т. Д.) В базе данных, Затем ваш контроллер запрашивает такие StaticPages::where(‘slug’,$slug)->first();

Ответ №2:

Сохраните URL или slug в своей базе данных

Route::get(‘staticpage/{pagename}’, ‘FrontEndController@methodName’);

$page = StaticPages::where(‘url’,$url)->first(); return view(‘YourStaticPage’, compact(‘страница’));

Комментарии:

1. Да, я думал об этом. Будет ли это нормальной / обычной практикой? И как бы вы поступили, если бы сайт был многоязычным, используя встроенную локализацию Laravel?

2. я уже сказал, что slug или url, в многоязычном slug отлично работают в качестве параметра.