【问题标题】:CodeIgniter - hidden controllerCodeIgniter - 隐藏控制器
【发布时间】:2012-04-28 02:06:12
【问题描述】:

我正在构建一个基于 CodeIgniter 的 CMS。它将“视图”及其数据存储在数据库中,并在需要时收集适当的数据。 您可能已经猜到了 - 我无法为每个页面生成物理控制器和匹配视图。

我认为 routes 会派上用场,因为我不想使用在 URL 中可见的控制器。解释得不好:我正在寻找一种方法,将所有不会出现在物理现有控制器上的请求重新分配给自定义请求 - 而不会出现在 URL 中。 当然,这个控制器会,处理 404 错误等。

不好:.com/handler/actual-view/) 好:(.com/actual-view/)(不存在实际视图控制器,否则会显示)

我添加了一个指向handler/404_override 路由。现在,我只是在寻找一种方法来找出请求的视图(即.com/actual-viewactual-view 是我正在寻找的)。

我试过了

$route['404_override/(:any)'] = 'handler/$1';

和类似的,这将完全删除 404 覆盖。

【问题讨论】:

    标签: php codeigniter http-status-code-404


    【解决方案1】:

    你会更好extending the base Router or Controller.

    通过这样做,您可以让您的应用程序变得灵活,并且仍然符合 CI 的工作方式。

    【讨论】:

    • 嗯..你愿意详细说明吗?
    • 这就是文档链接的用途。您有具体问题吗?
    • 我其实不懂一般概念。扩展对我有什么帮助?我不知道如果我以某种方式无法更改正在定义的加载顺序(控制器-> 404 到控制器-> 自定义-> 404)... 可能会在错误的圈子里思考; -)。
    • 通过扩展路由器,您可以告诉您的应用程序在以 show_404() 结束之前检查控制器(即您的 handler 控制器)。
    【解决方案2】:

    你需要在你的 route.php 配置文件中定义你所有的有效路由,然后在最后一行,

    $routes["(:any)"] = "specific controller path";
    

    如果我应该举个例子:

    $route['u/(:any)/account'] = "user_profile/account/$1";
    $route['u/(:any)/settings'] = "user_profile/settings/$1";
    $route['u/(:any)/messages'] = "user_profile/messages/$1";
    $route['u/(:any)'] = "user_profile/index/$1";
    

    如此处所示,在前三个无法捕捉到它之后,我将所有网址转移到用户个人资料。

    【讨论】:

    • 这将如何解决实际上最终在现有控制器上的请求?您的建议将强制所有请求由特定控制器处理。
    • 不,如果之前的路由无法捕获,它会将 URL 路由到特定的控制器。我自己在我的应用程序中使用它。
    • 这可以满足我的要求,但老实说有点杂乱,我宁愿只使用 404_override 或类似的代替(请参阅更新的 OP).. 感谢您的回复: )!
    • 好吧,你不想改变 url,所以这个方法或 .htaccess(如果你可以在 .htaccess 中写下哪些 url 确实存在的话)会对你有所帮助。
    【解决方案3】:

    在 CodeIgniters 很棒的论坛和 StackOverflow 的可爱成员的一些指导下,我的解决方案变成了将所有 404 错误路由到我的自定义控制器,在那里我确保它是真正的 404(没有视图或控制器)。稍后在控制器中,我从我的数据库 URI 字符串中收集我需要的其余信息:

    //Route
    $route['404_override'] = 'start/handler';
    
    //Controller
    function handler($path = false) {
    
       //Gather the URI from the URL-helper
       $uri_string = uri_string();
    
       //Ensure we only get the desired view and not its arguments
       if(stripos($uri_string, "/") !== false) {
          //Split and gather the first piece
          $pieces = explode("/", $uri_string);
          $desired_view = $pieces[0];
       } else {
          $desired_view = $uri_string;
       }
    
       //Check if there's any view under this alias
       if($this->site->is_custom_view($desired_view)) {
    
          //There is: ensure that the view has something to show
          if(!$this->site->view_has_data($desired_view)) {
             //No data to show, throw an error message
             show_custom_error('no_view_data');
          } else {
             //Found the views data: show it
          }
    
       } else {
          //No view to show, lets go with 404
          show_custom_404();
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      • 1970-01-01
      相关资源
      最近更新 更多