Laravel 做网站,新增一个分类,如何自动路由

新鸟一枚,问题如果让大神们感到作呕的话,请轻喷。

现在有个疑问,使用Laravel5.5做CMS或者博客的时候,当新增一个前台的分类或者栏目的适合,怎么实现自动路由,让该栏目可以访问?

比如说我想增加个关于我们的栏目,前台可以直接访问www.xxx.com/about_us 这样的链接,而不是每次增加一个栏目,都要手动的去配置路由web.php。

请问大神们,这部分应该怎么实现比较妥当?

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
最佳答案

最优解,真正的前后端分离

次优解leo提到的fallback route

更次,其他任何方式

5年前 评论
qIXbwU11 (楼主) 5年前
讨论数量: 16
JeffreyBool

自动生成代码即可。增加数据库的时候去web.php增加对应的路由

5年前 评论
h-o-o 5年前
小李世界 5年前
h-o-o 5年前
aab 5年前

Route::get('get/{tag}', 'TestController@index')

5年前 评论
h-o-o 5年前
vinhson (作者) 5年前
h-o-o 5年前
h-o-o 5年前
mengdodo 5年前

占座位,我也想知道答案。

5年前 评论

如果你不同栏目的页面内容,都是自动生成的,,,那可以用路由参数,然后拿参数找到对应的页面内容,,比如数据库的富文本,或者写好的视图文件,,,

如果还有其他逻辑,你又觉得二楼的方法不行,那就真不行了,,

5年前 评论
人厶八夂 5年前

@kenuo
@james_xue
@kangfq
@largezhou
@leo
我想到了一个办法,亲测可行:

Route::any('{controller}/{func}', function($controller, $func) {
    $controller = 'App\\Http\\Controllers\\' . $controller . 'Controller';
    return (new $controller)->$func();
})->where('controller', '.*');
5年前 评论

@Pariswer

噗,,,

之前有个帖子,跟你这个类似,不过他问的是,为啥不能自动注入了,,

你这样做也会有这个问题,比如你控制器方法: public index(Request $request, Service $service) 就会报错

帮你完善一下吧

Route::any('{controller}/{func}', function($controller, $func) {
    $controller = 'App\\Http\\Controllers\\' . $controller . 'Controller';
    return app()->call($contoller.'@'.$func);
})->where('controller', '.*');

而且,,,你这样做意义何在?就是少写一条路由配置?因为你这样,如果新增一个栏目,还不是要在控制器里,定义一个方法,,,比如 public function about_us() ,,,,

5年前 评论
h-o-o 5年前
largezhou (作者) 5年前
h-o-o 5年前
hackxiaoya 5年前
jxdr 4年前
$routes = DB::table('routes')->get();
foreach($routes as $router) {
 Route::$router->method($router->path,$router->controller);
}

强迫症不想要多一句sql,可以加个缓存

5年前 评论

你说的功能需要拆开为 路由实现 与 页面实现 两部分分开来进行实现

首先是路由实现,举个最简单的例子,例如你的页面 model 为 Page,那么 route 代码如下:

// web.php
Route::get('{slug}','PagesController@parse');

// PagesController
public function parse(Request $request,string $slug)
{
    // slug 可以理解为每个页面的唯一路径,例如你说的 about_us
    // 在这个 func 里拿到数据库内存储的 page 数据,然后进行解析,输出视图数据
    $page = Page::where('slug', $slug)->firstOrFail();
    ... pass
}

然后是第二部分,这部分我仅提供思路,大致方向有两种

    1. 既然我们已经拿到访问页面的 Model 实例了,那么后台新增将页面数写在数据库中,前端访问时根据数据动态渲染出页面即可。
    1. 后台添加时实时渲染生成视图代码,数据库中只记录位置信息。前端访问时根据位置信息索引到相关文件返回即可,这部分用 Blade 的 Render 与 FileSystem 实现起来也是很简单的
5年前 评论

我的做法:
在web.php
增加

    $page = \App\Models\Page::get();
    if($page){
        foreach ($page as $v){
            $route = 'page/'.$v->title_alias;
            Route::get($route,function () use ($v){
                return view('site.page',[
                    'model'=>$v,
                ]);
            })->name('page.'.$v->title_alias);
        }

    }
5年前 评论
kangfq 5年前
bykiss (作者) 5年前
jenkincei

加班中。。。
我曾做过这个,这个应在设计方案时考虑的,我是参照了dedecms实现,创建一个`categories`路由,这样新增栏目就不需要更改路由了。

5年前 评论

好问题啊,现在不是能不能做到的问题,而是哪种方式是最方便最合理的。

5年前 评论

创建一张路由表,每次新增之后通过代码生成路由文件

5年前 评论

你新增一个前台栏目的时候 应该让这个栏目的类型是可选的,比如跟路由关联,跟分类关联,跟模块关联等等。就挑分类关联来说吧,既然你是跟分类有关系的,正常来说就是为了访问当前分类下的内容。因此路由就是你通用的路由了比如/category/分类ID

5年前 评论

你的需求没有拆干净。
你所说的“栏目”是“什么东西的栏目”?

举例说明:
about_us这种的在我的系统里一般归为“单网页”这个功能模块

  • modal名称为Page
  • 前端路由配置为/pages/{tag},仅此一条配置即可

在Page模块添加一条记录,tag设置为"about_us",那么通过访问 http://domain.com/pages/about_us就可以访问到about_us这个页面

如果需要更多的Page类型页面,比如 enterprise profile,那就添加1条tag=enterprise_profile的数据,访问http://domain.com/pages/enterprise_profile 即可。

全自动路由这种东西ThinkPHP早期用的多一些,虽然自由一些,但是时间久了你会发现Laravel这种配置式的路由简洁好用的多,也不用担心暴露不必要的控制器。

当然我认为最重要的问题是你对“栏目”的认知并没有很清晰,对于分散在不同功能里的都叫“栏目”的功能在概念上就混杂在一起没有细化功能模块的边界。

5年前 评论

最优解,真正的前后端分离

次优解leo提到的fallback route

更次,其他任何方式

5年前 评论
qIXbwU11 (楼主) 5年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!