【问题标题】:How to reference a function after an argument in CodeIgniter URLs?如何在 CodeIgniter URL 中的参数后引用函数?
【发布时间】:2013-04-11 21:33:54
【问题描述】:

我想要的 Web 应用程序部分的 URL 结构如下:
/user/FooBar42/edit/privacy,我希望将其路由到控制器:用户,功能:编辑,FooBar42privacy 为论据(按此顺序)。 我应该如何使用 CodeIgniter 完成此任务?

【问题讨论】:

  • routes['user/(:any)'] = user/edit/$1/$2 在配置/路由上
  • 为什么不把网址按正确的顺序排列?
  • @J.Money 定义正确的顺序。我们已经确定,我们应用程序中的最佳 UX 设计遵循我描述的顺序,不管 CodeIgniter 是如何决定的。

标签: php codeigniter codeigniter-routing


【解决方案1】:

application/config/routes.php 中定义这个route 应该可以工作:

$route['user/(:any)/edit/(:any)'] = "user/edit/$1/$2";

但是,请注意,上述路由中的 (:any) 会匹配多个段。例如,user/one/two/edit/three 会调用user 控制器中的edit 函数,但只传递one 作为第一个参数,two 作为第二个参数。

(:any) 替换为正则表达式([a-zA-Z0-9]+) 将只允许一个长度至少为1 的字母数字值。这缓解了上述问题,其中允许/ 允许允许多个段。现在,如果使用user/one/two/edit/three,则会显示 404 页面。

$route['user/([a-zA-Z0-9]+)/edit/([a-zA-Z0-9]+)'] = "user/edit/$1/$2";

【讨论】:

  • 我没有对你投反对票,仅供参考。但问题是,这会路由像 user/login 这样的 URL,还是只路由匹配该规则的路由?
  • 我相信它不会路由 user/login 之类的东西,它应该只路由符合该规则的 URL。因此,如果 URL 的段为 user/login,它仍应调用 user 控制器中的 login 函数。
  • (:any) 将匹配包括 '/' 在内的任何内容,因此放置 user/(:any)/edit/(:any) 是完全多余的,如果您想这样做,只需使用正则表达式,
  • @tomexsans: 取决于 CI 版本 2.x (:any) 等于 (.+) 在 3.x 中等于 ([^/]+)
【解决方案2】:

您也可以使用 CI 控制器的重映射选项

http://ellislab.com/codeigniter/user-guide/general/controllers.html#remapping

并做这样的事情:

public function _remap($method, $params = array())
{
    // check if the method exists
    if (method_exists($this, $method))
    {
        // run the method
         return call_user_func_array(array($this, $method), $params);
    }
    else
    {
     // method does not exists so you can call nay other method you want
     $this->edit($params);
    }
}

【讨论】:

    猜你喜欢
    • 2011-07-29
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 2020-03-14
    • 1970-01-01
    相关资源
    最近更新 更多