【问题标题】:Routing in codeigniter :\在 codeigniter 中路由:\
【发布时间】:2012-01-22 12:21:04
【问题描述】:

我真的一直在为我的应用程序做路线,我发现植根于 CI 非常令人困惑 所以我所拥有的是每个国家/地区的一些人的页面,您可以通过在主页的下拉列表中选择一个国家来访问该页面 我设法使用 POST 方法传递数据,但问题是我无法通过 url 直接访问这些页面,因为它们的主控制器可以访问 db 并生成它们 所以现在我所有的网页都有这个网址

www.site.com/country 

国家是控制者

但我想要的是这样的:

www.site.com/name-of-country/name-of-person

知道怎么做吗?

【问题讨论】:

    标签: codeigniter url routes


    【解决方案1】:

    CI 中的控制器可以接受参数,就像常规函数一样。这些参数作为 URL 段传递。所以如果你想输入:

    www.site.com/name-of-country/name-of-person
    

    只需像这样编写你的函数:

    function Country($name_of_country, $name_of_person) { ... }
    

    要从 postdata 重定向,试试这个:

    function Country($name_of_country, $name_of_person) {
      if ($this->input->post('country') {
        redirect('/country/' . $this->input->post('country'));
      }
    }
    

    如需更多信息,请查看official documentation on routing

    【讨论】:

    • 谢谢,太好了,但是如果用户想扔主页然后进入人员页面,我将如何生成此 url,如何在 url 中显示?
    • 如果您想使用表单来执行此操作,您可以向 Country 控制器添加一个条件,该条件会查找 postdata 并根据需要进行重定向。
    • 是的,你是对的,它可以通过重定向来完成,我只是想通了,谢谢你的帮助:)
    【解决方案2】:

    您也可以使用一些正则表达式在 routes.php 文件中进行设置。这取决于您的应用程序是如何设置的以及您的路线是如何控制的。例如,如果您这样做:

    $route['(:any)/(:any)'] = 'country';
    

    你可能会比你想要的更多。您可以使用更具体的正则表达式而不是类似的通用表达式,或者...您可以稍微更改 URL 结构:

    $route['country/(:any)/(:any)'] = 'country/index/$1/$2';
    

    然后您可以在它所属的路由文件中设置该逻辑。如果你有一个路由文件,你应该使用而不是尝试通过控制器进行路由。

    【讨论】:

      【解决方案3】:

      这些答案没有提供足够的信息,而且接受的答案很糟糕......

      处理此问题的最佳方法是设置路由以执行以下操作(如果您想控制用户能够使用的国家/地区:

      把它放在你的路由文件中:

      foreach(array('country1', 'country2') as $country) { // array with allowed countries
        $routes[$country.'/(:any)'] = "country/view/{$country}/$1";
        $routes[$country] = "country/view/{$country}";
      }
      

      它的作用是获取您允许的国家/地区数组,然后为每个国家/地区创建一个路由规则,因此如果用户转到http://example.com/japan/naruto,它会路由到 URL http://example.com/country/view/japan/naruto。这是假设“日本”在您的“允许的国家/地区”数组中。

      第二个只是将 url http://example.com/japan 路由到 http://example.com/country/view/japan

      进入你的控制器country.php:

      class Country extends CI_Controller {
        function view($country, $username = false) { // $username=false allows you to show just a 'country' page if you want to
          if ($username) {
            $this->load->view('users_view', array('country' => $country, 'username' => $username));
          } else {
           $this->load->view('countries_view', array('country' => $country)) 
          }
        }
      }
      

      我在这里所做的使您能够为所显示的国家/地区创建一个页面,该页面将countries_view.php 从您的视图文件夹中加载出来,或者您可以查看该用户的页面,该页面加载了users_view.php页面。

      【讨论】:

      • 如果我拥有世界上所有国家,这是否可行?每当我激活一个国家/地区时,我都会将县名存储在数据库中,用户应该可以看到它
      • 是的,您需要将它们放入一个数组并在该数组上运行 foreach()。
      • 因此,您宁愿在您的路线文件中手动维护一系列国家/地区,也不愿让数据库(已包含相同信息)为您进行访问控制?现在,您不仅违反了 DRY(不要重复自己)原则和构建 CodeIgniter 的 MVC 架构背后的驱动原则,而且还为自己做了很多工作。
      • 回答的目的是为了演示如何做到这一点。该数组很容易是从数据库中提取的国家。我还发现您的反对票完全没有道理,因为我的回答没有错。在回答问题时,你的工作不是为某人做所有的工作,更多的是“向他们展示如何”,他们会根据自己的需要调整答案。我假设 OP 有一些查询数据库和从结果数据中创建数组的知识,否则创建数据库驱动的站点可能不是一个明智的选择......
      • OP 询问如何使用路由文件根据动态数据重定向 URL,可能是在数据库或其他数据模型中(或者至少应该是)。您的回答确切地告诉他如何做到这一点。麻烦的是,你们都在滥用路由文件。它不打算作为动态数据的看门人,当然也不打算与数据库交互。我告诉他解析 URL 的正确方法——也就是说,通过使用控制器参数——你称之为“太糟糕了”。我对您的回答投了反对票,因为它延续了不良做法。
      猜你喜欢
      • 2010-11-20
      • 2011-07-08
      • 1970-01-01
      • 2012-09-08
      • 2012-09-29
      相关资源
      最近更新 更多