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

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

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

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

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

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
最佳答案

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

次优解leo提到的fallback route

更次,其他任何方式

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

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

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

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

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

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

4年前 评论

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

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

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

@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', '.*');
4年前 评论

@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() ,,,,

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

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

4年前 评论

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

首先是路由实现,举个最简单的例子,例如你的页面 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 实现起来也是很简单的
4年前 评论

我的做法:
在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);
        }

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

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

4年前 评论

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

4年前 评论

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

4年前 评论

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

4年前 评论

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

举例说明:
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这种配置式的路由简洁好用的多,也不用担心暴露不必要的控制器。

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

4年前 评论

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

次优解leo提到的fallback route

更次,其他任何方式

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

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