#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 отлично работают в качестве параметра.