【问题标题】:Codeigniter - routing to the controller if it exists, if not use dafaultCodeigniter - 如果存在则路由到控制器,如果不存在则使用默认值
【发布时间】:2013-03-01 08:33:43
【问题描述】:

所以我设置了这样的路线:

$route[':any'] = "main";
$route['products/(:any)'] = "products/product/$1";

例如 www.mysite.com/something 转到主控制器,我在其中处理 “something”。 我以类似方式处理产品。

但是正如你之后看到的那样,我必须用我希望使用的方法而不是主控制器来写下所有其他控制器。有没有办法让它自动检测控制器是否存在使用控制器而不是默认的“main”

$route['products'] = "products";
$route['admin/user/login'] = "admin/user/login";
$route['admin/user/logout'] = "admin/user/logout";
$route['admin/migrations'] = "admin/migrations";
$route['admin/dashboard'] = "admin/dashboard";

【问题讨论】:

    标签: php codeigniter


    【解决方案1】:

    因为我在某处的博客上找到它,所以我不相信它,但我在我的 routes.php 中使用以下代码,在你的情况下,我会将它放在 $route[':any'] = "main"; 上方

    $controller_dir = opendir(APPPATH."controllers");
    
    while (($file = readdir($controller_dir)) !== false) {
    
        if (substr($file, -4) == ".php" ) {
    
            $route[substr($file, 0, -4)."(.*)"] = substr($file, 0, -4)."$1";
    
        } elseif (substr($file, -5) == ".php/") {
    
            $route[substr($file, 0, -5)."(.*)"] = substr($file, 0, -5)."$1";
    
        }
    }
    

    如果我需要覆盖其中的任何一个,或者有任何独特的路线,我将它们放在 routes.php 文件的顶部,在此代码上方。

    【讨论】:

    • 感谢 Jeemsu,这似乎有效 - 我编辑了您的答案,为控制器/方法和控制器/方法/var1 添加了路由。即使它有效,它似乎有点hacky..无论如何再次感谢。 @Petah - 我们又来了:)
    • 嗨,为什么不使用这个 $route['404_override'] = 'notfound';并创建 notfound 控制器并使所有代码变得简单灵活。
    • @wasim 对我来说似乎有点 hacky,为什么要使用专门用于捕获 404 错误的路由来路由所有应用程序逻辑?
    • 实际上,如果找不到控制器,那么从逻辑上讲,我们应该在 404 中覆盖,我们可以像控制器一样,如果找不到控制器但 URL 是等等等等,那么做其他事情就做 404 ......所以我们仍然控制 404。除此之外,它比使用自定义 php 更方便
    • 404 catch all 应该是最后的手段。将所有路由保存在 routes.php 中是合乎逻辑的,这就是我希望在开发人员接近其他人的 codeigniter 项目时找到它们的地方。归根结底,做任何你认为最合乎逻辑的事情,每个人都有自己的发展方法。
    猜你喜欢
    • 2022-12-15
    • 2013-09-10
    • 2023-03-03
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 2013-02-08
    • 2022-11-14
    相关资源
    最近更新 更多