【问题标题】:Automatic Laravel routing for static pages静态页面的自动 Laravel 路由
【发布时间】:2021-02-19 11:08:56
【问题描述】:

我必须为客户维护一个网站,他们是用 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 的高级用户。

【问题讨论】:

    标签: php laravel routes


    【解决方案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'));
    }
    

    【讨论】:

    • 但是我不会丢失当前的URL,不是所有的静态页面都有domain.com/static/1domain.com/static/2等路径吗?如果我这样做是否可行:Route::get('{page}', 'FrontEndController@index'); 然后以某种方式通过 URL 而不是 ID 获取项目?
    • @Adam 您可以受益于正则表达式,然后将您的旧式路由重定向到新路由。另一方面,您可以像这样更改您的路由 Route::get('example-page-{id}', ' FrontEndController@index')
    • 对不起,如果我的问题没有正确表述,但当前 URL 没有 id 后缀,这些只是示例。你能解释一下我在这种情况下如何使用正则表达式吗?
    • @Adam 你可以像这样重定向你的路由 Route::redirect('/{example_url}','static/{id}');如果您的愿望不是这样,那么您需要将您的 slug 保存在数据库中的所属行(例如 example-page-01、example-page-02 等)中,然后您的控制器请求像这样 StaticPages::where('蛞蝓',$slug)->first();
    【解决方案2】:

    在你的数据库中保存 url 或 slug

    Route::get('staticpage/{pagename}', 'FrontEndController@MethodName');

    $page = StaticPages::where('url',$url)->first(); return view('YourStaticPage', compact('page'));

    【讨论】:

    • 是的,我想过。这会是一种正常/传统的做法吗?如果网站是多语言的,使用 Laravel 的内置本地化,你会怎么做?
    • 我已经说过 slug 或 url ,在多语言 slug 中作为参数可以正常工作。
    猜你喜欢
    • 2016-03-05
    • 2021-11-28
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多